首頁 > Java > java教程 > 主體

java如何捕捉InterruptedException錯誤

WBOY
發布: 2023-04-18 20:10:34
轉載
880 人瀏覽過

捕獲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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板