ホームページ >Java >&#&チュートリアル >すべての ExecutorService タスクが完了するのを効率的に待つ方法は?

すべての ExecutorService タスクが完了するのを効率的に待つ方法は?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-03 12:28:10191ブラウズ

How to Efficiently Wait for All ExecutorService Tasks to Finish?

ExecutorService タスクの終了を待機しています

質問:

ExecutorService タスクの終了を効率的に待つにはどうすればよいですか? ExecutorService に送信されたすべてのタスクを完了するには?特定の使用例には、複数のコアで実行される計算タスクが含まれます。

Background:

指定されたコード スニペットは ExecutorService.wait() を利用しますが、IllegalMonitorStateException で失敗します。タスクの実行は成功しましたが、待機操作で問題が発生したようです。

回答:

ExecutorService.invokeAll()

推奨される解決策は ExecutorService.invokeAll() を使用することです。これは、すべてのタスクが完了するのを待つための簡単な方法を提供します。変更されたコード例は次のとおりです。

ExecutorService es = Executors.newFixedThreadPool(2);
List<Callable<Object>> todo = new ArrayList<>(singleTable.size());

for (DataTable singleTable: uniquePhrases) {
    todo.add(Executors.callable(new ComputeDTask(singleTable)));
}

List<Future<Object>> answers = es.invokeAll(todo);

invokeAll() 動作

invokeAll() は、すべてのタスクが完了するまでブロックされます。結果の回答コレクションには、各タスクのステータスと潜在的な戻り値を表す Future が含まれます。デフォルトでは、Executors.callable() でラップされたこれらの Future は null を返します。ただし、ComputeDTask を変更して Callable を実装することはできます。

利点:

invokeAll() を使用すると、コードが簡素化され、wait() に関連する潜在的な競合状態が回避されます。また、ExecutorService を複数のサイクルで再利用できるようになります。

関連質問:

さらに詳しく説明するには、Stack Overflow に関する次の関連質問を検討してください。

  • [すべてのスレッドが完了するまで待つ方法終了](https://stackoverflow.com/questions/13796491/how-to-wait-for-all-threads-to-finish)
  • [Java スレッドからの戻り値](https://stackoverflow .com/questions/11937661/return-values-from-java-threads)
  • [invokeAll() は望んでいませんコレクションを受け入れる>](https://stackoverflow.com/questions/24168027/invokeall-not-willing-to-accept-a-collectioncallablet)
  • [する必要がありますか?同期しますか?](https://stackoverflow.com/questions/546386/do-i-need-to-synchronize)

以上がすべての ExecutorService タスクが完了するのを効率的に待つ方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。