ホームページ >Java >&#&チュートリアル >無限ループを発生させずに ExecutorService スレッドの完了を効率的に待つ方法は?

無限ループを発生させずに ExecutorService スレッドの完了を効率的に待つ方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-14 17:41:16148ブラウズ

How to Efficiently Wait for ExecutorService Thread Completion Without Infinite Loops?

ExecutorService によるスレッドの完了の待機

ExecutorService を使用して複数のタスクを同時に実行する場合、完了通知を効果的に処理することが重要になります。この記事では、無限ループに依存せずにすべてのスレッドが終了するのを待つ最良の方法を検討します。

問題で説明されているように、無限ループは最適な解決策とは見なされません。代わりに、ExecutorService はタスクの完了を管理するための組み込みメカニズム、shutdown() メソッドと awaitTermination() メソッドを提供します。

shutdown() と awaitTermination() の使用

ExecutorService インターフェイスは shutdown() メソッドを提供し、ExecutorService に新しいタスクを受け入れないよう通知します。現在送信されているすべてのタスクが完了すると、ExecutorService は終了します。

タスクの完了を待機するには、awaitTermination() メソッドが使用されます。このメソッドは 2 つのパラメータを取ります。

  • timeout: タスクの完了を待機する最大時間を指定します。
  • timeUnit: タイムアウトの時間単位。

質問に示されている例では、コードは次のように変更できます。

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

Long.MAX_VALUE タイムアウトにより、すべてのタスクが完了するまで awaitTermination() メソッドがブロックされます。タスクの完了に時間が重要な場合は、有限のタイムアウトを指定できます。

結論

shutdown() メソッドと awaitTermination() メソッドを使用すると、信頼性が高く効率的な方法が提供されます。無限ループに頼ることなく、すべてのスレッドが終了するのを待ちます。このアプローチにより、タスク管理が簡素化され、制御された方法でスレッドが確実に完了します。

以上が無限ループを発生させずに ExecutorService スレッドの完了を効率的に待つ方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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