一連のスレッドが何らかのタスクを実行するプログラムがあります。これらすべてのスレッドがいつ終了するかを知りたいので、それらの結果で他のことを行うことができます。みたいなものは使いたくないThread.join
。私が好むのは、これらすべてのスレッドをチェックする別のスレッドであり、それらが終了したことを確認すると、特別なタスクを実行します。これを行う方法についてのアイデアはありますか?
質問する
273 次
2 に答える
4
私は次のようなExecutorServiceを使用します
List<Future> futures = new ArrayList<Future>();
for(int i = 0; i < N_TASKS; i++)
futures.add(executorService.submit(new Task(i));
// wait for all tasks to complete.
for(Future future : futures) future.get();
于 2012-10-21T17:49:46.927 に答える
4
実際、ブロッキングは実装がはるかに簡単で、信頼性が高く、余分なオーバーヘッドやレイテンシーが発生しません。を使用したくない場合は、一連のスレッドを待機できる をjoin()
検討してください。CountDownLatch
もう 1 つの、より快適なアプローチはExecutorService
、軽量でラップされていExecutorCompletionService
ます。
両方のアプローチは、非ブロッキング方式で使用できます。たとえば、ブロックして結果を待つのではなく、ピークのみを使用できます。ただし、CPU サイクルを無駄にしないためには、別のバックグラウンド スレッドをブロックして結果を待機し、すべてのワーカー スレッドが完了したらすぐに何らかのイベントを送信します。
または、完了時に各ワーカー スレッドにイベントを送信させます。これらのイベントを受け取るオブジェクトは、受け取ったイベントの数が開始されたワーカーの数に達すると、処理が完了したことを認識します。ListenableFuture
from Guava を使用すると、余分なウォッチドッグ スレッドを回避することもできます。
于 2012-10-21T17:51:33.187 に答える