ホームページ >Java >&#&チュートリアル >JavaでInterruptedExceptionエラーをキャッチする方法

JavaでInterruptedExceptionエラーをキャッチする方法

WBOY
WBOY転載
2023-04-18 20:10:34891ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。