java.util.concurrentパッケージは、マルチスレッド操作に関するクラスを提供します。一般的に使用されるものは、executorserviceとその実装クラス(ThreadPoolexecutorなど)、執行者、執行者、将来、呼び出し可能などです。
1。executorservice(exedected from executor)インターフェイス:execute()、submit()、shutdown()、shutdownnow()などの非同期マルチスレッド操作方法を提供します。
2。エグゼキューターインターフェイス:1つのメソッドのみが実行された(実行可能a)を使用して、提出されたタスク(スレッド)を実行する
2。執行者クラス:newxxx()、xxxthreadfactory()など、エグゼキューターのサブクラスやスレッドファクトリーなどを操作するための工場の方法とパブリック方法を提供します。
3。未来のインターフェイス:スレッドの実行結果を表し、スレッド実行結果を取得する方法を提供し、get()、cancle()などのスレッドをキャンセルします。
4.コール可能なインターフェイス:戻り値のスレッドは、JDK1.5によって新しいインターフェイスを実行するために提供されます
executorserviceと未来の理解の簡単な記録を作成する
コード:
Public Class Main {private static int count = 0; public static void main(string [] args){list <future> resultlist = new LinkedList <>(); /*** executors.newcachedthreadpool()スレッドキャッシュプールを作成します。スレッドが60年代に使用されていない場合、スレッドは停止してキャッシュプールから削除されます* executors.newscheduledthreadpool()固定容量のスレッドプールを作成し、セットスケジューリング時間に従ってエグゼクティブに従ってexecuters.newfixedthreadpool()に従って実行されます。 executorservice executorservice = executors.newcachedthreadpool(); for(int i = 0; i <10; i ++){future future = executorservice.submit(new callable <string>(){@override public string call(){try {system.out.println(thread.currentthread()。getName()。 main.out.println()。 resultlist.add(future); } executorservice.shutdown(); for(Future Future:resultList){try {system.out.println(future.get() + "..is oven ..."); } catch(arturnedexception e){e.printstacktrace(); } catch(executionException e){e.printstacktrace(); }} system.out.println( "メインスレッドエンド..."); }}出力:
pool-1-thread-1pool-1-thread-2pool-1-thread-1-pool-1-thread-4pool-1-thread-5pool-1-thread-1-thread-7pool-1-thread-8pool-1-thread-9pool-1-thread-10pool-1-thread-1..start mainメインカウント:... 1pool-1-thread-2..end main count:... 1pool-1-thread-1..end main count:... 1pool-1-thread-3..end main count:... 1pool-1-thread-2..end main count:... 1pool-1-thread-1..end main count:... 1pool-1-thread-3..Endメイン:...オーバー... Pool-1-Thread-4..Start Main Count:... 2Pool-1-Thread-3..Onis ... Pool-1-Thread-4..End Main Count:... 3Pool-1-Thread-4..Onis Over ... Pool-1-Thread-5..Start Main Count:... 3Pool-1-Thread-5..endメインカウント: count:... 4pool-1-thread-6..end main count:... 4pool-1-thread-6..end main count:... 4pool-1-thread-6..end main count:... 4pool-1-thread-6..end main count:... 4pool-1-thread-6..end main count:... 5pool-1-thread-6..is count:... 6pool-1-thread-7 .. over ... pool-1-thread-8..Start Main Count:... 6pool-1-thread-8..End Main Count:... 7pool-1-thread-8..over ... pool-1-thread-9..tart main count:... 7pool-1-thread-9..end mainカウント: count:... 7pool-1-thread-9..end main count:... 8pool-1-thread-9 .. over ... pool-1-thread-10..tart main count:... 8pool-1-thread-9..oin ... pool-1-thread-10..tart mainカウント:...
コンソールは、5秒間待った後、上記の出力結果を印刷します。その理由は、すべてのスレッドが起動すると、それは同時操作であり、5秒間待つためです。全体として、5秒しか待っていたようです。これは同時操作です。
要約:
1。Execute ()メソッドとexecuteServiceが提供するsubmit()メソッドの違い:
a。 execute()メソッドは、実行可能なタイプのインスタンスのみを受け入れるため、返品値を取得できず、スレッド実行の状況を動的に取得することもできません。
b。 submit()メソッドは、実行可能なインスタンスと呼び出し可能なインスタンスを受け入れ、将来のインスタンスを返します。 futureインスタンスのget()メソッドは、スレッド実行戻り値を取得し、スレッド実行の例外をスローすることができます。したがって、結果をスレッドの実行によって返され、スレッド実行中に可能な例外を処理できる場合、または中央でスレッド実行をキャンセルする場合は、submit()メソッドを使用できます。
2。出力を介して、すべてのスレッドが実行を完了した後、メインメソッド(メインスレッド)が終了することがわかります。理由:
a。 submit()メソッドを使用して将来のインスタンスを取得し、将来のインスタンスのget()メソッドを使用してスレッドリターン結果を取得します。 futureインスタンスのget()メソッドは、リターン前にスレッドが実行されるのを待つため、メインメソッドはすべての子スレッドが終了する前に終了するのを待ちます
b。上記の赤でマークされたループが削除されている場合、メインメソッド(メインスレッド)がすべての子供のスレッドが終了するのを待たずに早期に終了します
補充:
1.複数のスレッドが同時に実行されると、スレッドのいずれかで例外が発生し、処理されていない場合、スレッドは自動的に実行を停止しますが、他のスレッドはまだ正常に実行されます。これが、Tomcatリクエストで例外が発生した場合にTomcatがサービスを提供し続けることができる理由です。
2。Tomcatは、スレッドプールと待機中のプールを提供します。各リクエストは、リクエストを処理するために新しいスレッドを再起動します。スレッドプールのスレッドが使い果たされると、待機中のプールに配置され、待機します。スレッドがスレッドプールにリリースされると、スレッドが割り当てられ、待機中のプールでリクエストを処理します。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。