Java ExecutorService の正常なシャットダウン
Executor は、Java アプリケーションでタスクを同時に管理および実行するための便利な方法です。ただし、不適切にシャットダウンすると、予期しない動作やパフォーマンスの問題が発生する可能性があります。このガイドでは、ExecutorService を適切にシャットダウンし、すべてのタスクが確実に終了またはキャンセルされるようにする方法について詳しく説明します。
ExecutorService のシャットダウンについて
ExecutorService には 2 つの主要なシャットダウン方法があります。 :
シャットダウンによってすべてのタスクが終了することが保証されないことに注意することが重要です。割り込みに応答できないタスクや、長時間実行されるタスクは、アクティブなままになる可能性があります。
推奨されるシャットダウン手順
Oracle のドキュメントでは、正常にシャットダウンするための次のアプローチが推奨されています。
void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown();
try {
// Wait for existing tasks to terminate
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
pool.shutdownNow();
// Wait for tasks to respond to cancellation
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ie) {
pool.shutdownNow();
Thread.currentThread().interrupt();
}
}
このアプローチでは、新しい送信を防止しながら、既存のタスクの完了を確実に許可します。シャットダウン プロセスに予想より時間がかかる場合は、
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
を
while (!pool.awaitTermination(60, TimeUnit.SECONDS))
タスクの完了を待ち続けます。
シャットダウン方法の概要
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3