1

重複の可能性:
ExecutorService、すべてのタスクが完了するのを待つ方法
Java ExecutorService: await 再帰的に作成されたすべてのタスクの終了

ExecutorServiceすべてのタスクが完了するまで現在のスレッドをブロックする方法はありますか?

executor.execute(task1);
executor.execute(task2);
executor.execute(task3);
executor.execute(task4);
executor.execute(task5);
// ...now I want to block until all tasks have finished executing...
System.out.println("done!")
4

2 に答える 2

7

すべてのタスクについて、それらを List callables に入れてから、それらに対して invokeAll

ExecutorService e = ...

e.invokeAll(callables);

Javadoc ごと

指定されたタスクを実行し、すべてが完了するとステータスと結果を保持する Future のリストを返します。Future.isDone() は、返されたリストの各要素に対して true です。完了したタスクは、通常どおり終了するか、例外をスローして終了する可能性があることに注意してください。この操作の進行中に指定されたコレクションが変更された場合、このメソッドの結果は未定義です。

したがって、スレッドはすべてのタスクが完了するまで待機します

于 2011-06-16T18:12:26.553 に答える
3

ThreadPoolExecutorプールサイズをJava6またはJava8に設定して、実行するすべてのタスクを使用し、呼び出して、送信されたすべてのタスクが完了するまでブロックで待機することができます。ここで、はインスタンスへの参照です。System.getRuntime().availableProcessors()Runtime.getRuntime().availableProcessors().execute()tpe.shutdown()while(!tpe.terminated()) { /* waiting for all tasks to complete */}tpeThreadPoolExecutor

または、より適切な場合は、ExecutorCompletionServiceを使用します。提供されたExecutorを使用してタスクを実行するCompletionService このクラスは、送信されたタスクが完了すると、takeを使用してアクセス可能なキューに配置されるように調整します。このクラスは、タスクのグループを処理するときの一時的な使用に適したほど軽量です。

于 2011-06-16T15:57:17.740 に答える