ホームページ >Java >&#&チュートリアル >ExecutorService ですべてのタスクが完了するのを効率的に待つにはどうすればよいですか?

ExecutorService ですべてのタスクが完了するのを効率的に待つにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-10 16:01:11879ブラウズ

How Can I Efficiently Wait for All Tasks to Complete in an ExecutorService?

ExecutorService: タスクの完了を待つ

ExecutorService は効率的にタスクを実行するための便利なツールですが、すべてのタスクが完了するまで一時停止するのは難しい場合があります。一般的な問題とその実際的な解決策について詳しく見てみましょう。

wait() のエラー

固定スレッド プール ExecutorService を使用する引用コード スニペットでは、次のような問題が発生します。 es.wait() を使用しようとすると IllegalMonitorStateException が発生します。これは、wait() が ExecutorService ではなく、特定のスレッド同期イディオムでの使用を目的としているために発生します。

最も簡単な解決策: invokeAll()

ExecutorService は、より簡単な代替手段を提供します。この目的: invokeAll()。このメソッドは、呼び出し可能なタスクのコレクションを取得し、それらを並行して実行し、すべてのタスクが終了するまでブロックします。使用方法は次のとおりです。

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

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

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

invokeAll() は、それぞれが個別のタスクを表す Future オブジェクトのリストを返します。すべてのタスクが完了すると、Future の isDone() にアクセスすると true が返されます。

invokeAll() の利点

  • すべてのタスクが完了するまでブロックします。
  • 手動シャットダウンを回避し、同期。
  • 複数のタスク サイクルで ExecutorService を再利用できます。

その他のメソッド

  • shutdown() および awaitTermination()も使用できますが、手動でシャットダウンする必要があります
  • submit(Callable) は個々のタスクの送信に使用できますが、タスクの完了を手動で追跡する必要があります。

invokeAll() では、タスクが Callable を実装する必要があることに注意してください。 ComputeDTask が Runnable の場合は、コード スニペットに示されているようにラップするか、Executors.callable() を利用します。

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

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