ExecutorService によるスレッドの完了の待機
ExecutorService を使用して複数のタスクを同時に実行する場合、完了通知を効果的に処理することが重要になります。この記事では、無限ループに依存せずにすべてのスレッドが終了するのを待つ最良の方法を検討します。
問題で説明されているように、無限ループは最適な解決策とは見なされません。代わりに、ExecutorService はタスクの完了を管理するための組み込みメカニズム、shutdown() メソッドと awaitTermination() メソッドを提供します。
shutdown() と awaitTermination() の使用
ExecutorService インターフェイスは shutdown() メソッドを提供し、ExecutorService に新しいタスクを受け入れないよう通知します。現在送信されているすべてのタスクが完了すると、ExecutorService は終了します。
タスクの完了を待機するには、awaitTermination() メソッドが使用されます。このメソッドは 2 つのパラメータを取ります。
質問に示されている例では、コードは次のように変更できます。
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 サイトの他の関連記事を参照してください。