InterruptedException エラーのキャッチ
以下のコード スニペットを確認してください:
public class Task implements Runnable { private final BlockingQueue queue = ...; @Override public void run() { while (!Thread.currentThread().isInterrupted()) { String result = getOrDefault(() -> queue.poll(1L, TimeUnit.MINUTES), "default"); //do smth with the result } } T getOrDefault(Callable supplier, T defaultValue) { try { return supplier.call(); } catch (Exception e) { logger.error("Got exception while retrieving value.", e); return defaultValue; } } }
コードの問題は、中断されたフラグが決して復元されないため、スレッドを終了することはできません:
1. コードを実行しているスレッドは中断されます。
2.BlockingQueue #poll() メソッドは InterruptedException をスローし、割り込みフラグをクリアします。
3.while のループ条件 (!Thread.currentThread().isInterrupted()) の判定は、マークがクリアされているため true となります。
この動作を防ぐには、メソッドが明示的に (InterruptedException をスローするように宣言することによって) または暗黙的に (プリミティブ例外を宣言/スローすることによって) InterruptedException 例外がスローされたときに常にキャッチし、中断されたフラグを復元します。
rree以上がJavaでInterruptedExceptionエラーをキャッチする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。