首頁 >Java >java教程 >java如何捕捉InterruptedException錯誤

java如何捕捉InterruptedException錯誤

WBOY
WBOY轉載
2023-04-18 20:10:34895瀏覽

捕獲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異常,並恢復中斷的標誌。

T getOrDefault(Callable supplier, T defaultValue) {
	try {
		return supplier.call();
	}
	catch (InterruptedException e) {
		logger.error("Got interrupted while retrieving value.", e);
		Thread.currentThread().interrupt();
		return defaultValue;
	}
	catch (Exception e) {
		logger.error("Got exception while retrieving value.", e);
		return defaultValue;
	}
}

以上是java如何捕捉InterruptedException錯誤的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除