1. ホーム

[解決済み】ExecutorServiceを使用して、すべてのスレッドが終了するのを待つにはどうすればよいですか?

2022-03-24 10:50:47

質問

一度に4つのタスクを大量に実行したいのですが、どうすればいいですか?

ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
    taskExecutor.execute(new MyTask());
}
//...wait for completion somehow

すべて完了したら、どのように通知されるのでしょうか?今のところ、グローバルなタスク・カウンターを設定して、すべてのタスクの終了時にそれを減らし、このカウンターが0になるのを無限ループで監視する、あるいはFutureのリストを取得して、無限ループですべてのタスクのisDoneを監視する以外に思いつきません。無限ループを伴わない、より良い解決策は何でしょうか?

ありがとうございます。

解決方法は?

基本的に ExecutorService を呼び出すと shutdown() で、次に awaitTermination() :

ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
  taskExecutor.execute(new MyTask());
}
taskExecutor.shutdown();
try {
  taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
  ...
}