スレッド プールに Executors を使用し、タスクを送信しています。一部のタスクがデータベースまたはソケットへの I/O 呼び出しでブロックされている場合でも、executorService.shutdownNow はすべてのタスクをシャットダウンできますか?
4 に答える
タスクが適切に作成されているかどうかにかかっています。
ドキュメントには次のように記載されています。
ただし、Java は「何もないところから」スレッドを強制終了しません。それらを妨害しようとします。適切なタスクはInterruptException
、shutdownNow がそれらを中断しようとしたときに何らかのエラーをスローし、正常に終了します。あなたはソケット通信について言及しています-ほとんどのまともなクライアントのブロッキングメソッドは、中断された場合、中断された例外をスローします。
悪いタスクの例は、(むしろ明らかに) でスレッドを実行することwhile(true) { readChunk(); if(endOfChunks) { break;} }
です。これは、正常な割り込みチェックを提供しません! while ループを使用して待機するのではなく、中断できる「ブロッカー」オブジェクトをwait()
使用するのが古いルールです。syncronized
簡単に言えば、それに頼ることはできません。実行中のタスクをExecutorService
単に中断します。彼らが実際に努力をキャンセルするかどうかは、タスクの実装次第です。一部の I/O は中断される可能性があります (特に中断される可能性があります)java.nio
が、java.io
ほとんどの場合中断されません。java.lang.Thread.interrupt() の機能を参照してください。もう少し説明が必要です。