私は非常に混乱しており、InterruptedException を飲み込んではいけない理由を理解できません。
IBMの記事によると
ブロッキング メソッドが割り込みを検出して InterruptedException をスローすると、割り込み状態がクリアされます。InterruptedException をキャッチしても再スローできない場合は、割り込みが発生したという証拠を保持して、コール スタックの上位にあるコードが割り込みを認識し、必要に応じて応答できるようにする必要があります。
public class TaskRunner implements Runnable {
private BlockingQueue<Task> queue;
public TaskRunner(BlockingQueue<Task> queue) {
this.queue = queue;
}
public void run() {
try {
while (true) {
Task task = queue.take(10, TimeUnit.SECONDS);
task.execute();
}
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();//preserve the message
return;//Stop doing whatever I am doing and terminate
}
}
}
また、Java Concurrency in Practice では、第 7.1.3 章: 割り込みへの対応でこれについて詳しく説明しています。そのルールは次のとおりです。
スレッドの割り込みポリシーを実装するコードのみが、割り込み要求を飲み込むことができます。汎用タスクおよびライブラリ コードは、割り込み要求を飲み込むべきではありません。
1.より高いコールスタックのコードで Thread.currentThread().interrupt(); によって設定されたステータスを利用する方法を誰でも説明できますか? スレッドが終了したときの catch ブロックで?
また、上記のルールについて説明してください。