捕獲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中文網其他相關文章!