Java ExecutorService を扱う場合、重要な点はすべてのタスクが適切に終了するようにシャットダウン プロセスを処理することです。タスクの実行中にタイムアウトやその他の中断が発生すると、これは困難になります。
カスタム アプローチ
提供されたコードは、CallableTask オブジェクトを実行する ExecutorService が困難に直面するシナリオを示しています。すべてのタスクが完了したらシャットダウンします。この問題は、タイムアウトしきい値を超えたタスク スレッドがアクティブなままになり、実行の終了が妨げられる可能性があることが原因です。
推奨される解決策
この問題に対処するには、Oracle API ExecutorService のドキュメントでは、次のアプローチを推奨しています。
<code class="java">void shutdownAndAwaitTermination(ExecutorService pool) { pool.shutdown(); try { if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { pool.shutdownNow(); if (!pool.awaitTermination(60, TimeUnit.SECONDS)) System.err.println("Pool did not terminate"); } } catch (InterruptedException ie) { pool.shutdownNow(); Thread.currentThread().interrupt(); } }</code>
このメソッドは、順序だったシャットダウン プロセスを保証します。
シャットダウン関連メソッドの概要
追加のヒント
頑固なタスクのシャットダウン タイムアウトを延長するには、awaitTermination():
<code class="java">if (!pool.awaitTermination(60, TimeUnit.SECONDS)) </code>
を次のように変更します:
<code class="java">while (!pool.awaitTermination(60, TimeUnit.SECONDS)) </code>
これらの手法を実装すると、ExecutorService のシャットダウン プロセスの信頼性が向上し、タスクの適切な終了とシステムのクリーンアップが保証されます。
以上がJava ExecutorService のシャットダウン中にタスクを確実に終了する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。