2

スレッド プールに Executors を使用し、タスクを送信しています。一部のタスクがデータベースまたはソケットへの I/O 呼び出しでブロックされている場合でも、executorService.shutdownNow はすべてのタスクをシャットダウンできますか?

4

4 に答える 4

4

タスクが適切に作成されているかどうかにかかっています。

ドキュメントには次のように記載されています。

ただし、Java は「何もないところから」スレッドを強制終了しません。それらを妨害しようとします。適切なタスクはInterruptException、shutdownNow がそれらを中断しようとしたときに何らかのエラーをスローし、正常に終了します。あなたはソケット通信について言及しています-ほとんどのまともなクライアントのブロッキングメソッドは、中断された場合、中断された例外をスローします。

悪いタスクの例は、(むしろ明らかに) でスレッドを実行することwhile(true) { readChunk(); if(endOfChunks) { break;} }です。これは、正常な割り込みチェックを提供しません! while ループを使用して待機するのではなく、中断できる「ブロッカー」オブジェクトをwait()使用するのが古いルールです。syncronized

于 2013-04-29T16:36:11.083 に答える
0

簡単に言えば、それに頼ることはできません。実行中のタスクをExecutorService単に中断します。彼らが実際に努力をキャンセルするかどうかは、タスクの実装次第です。一部の I/O は中断される可能性があります (特に中断される可能性があります)java.nioが、java.ioほとんどの場合中断されません。java.lang.Thread.interrupt() の機能を参照してください。もう少し説明が必要です。

于 2013-04-29T16:39:14.780 に答える