首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 多執行緒中斷詳解:interrupt 方法、狀態檢測與最佳實踐

     編輯:Java 程式設計入門

interrupt() 方法語義

Thread.interrupt() 不會強制終止執行緒,而是發送中斷請求(設定內部中斷標記)。具體響應行為由目標執行緒決定,常見模式為拋出異常或檢查標記後退出。

中斷對不同狀態的影響

執行緒狀態中斷標記拋出異常說明
正常運行設為 true否需主動檢查 isInterrupted()
Object.wait() / Thread.sleep() / Thread.join()清除InterruptedException阻塞方法捕獲中斷並拋出異常
InterruptibleChannel I/O設為 trueClosedByInterruptException通道被關閉
Selector.select()設為 true無(立即返回)需檢查返回值或 wakeup()
非活躍執行緒無影響否中斷已終止執行緒無效果

檢測中斷的兩種方式

1. 捕獲 InterruptedException(適用於可中斷阻塞)

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    Thread.currentThread().interrupt(); // 恢復標記
    return; // 退出 run()
}

2. 主動輪詢中斷標記(適用於計算密集型)

while (!Thread.currentThread().isInterrupted()) {
    doWork();
}
// 或使用靜態方法(會清除標記)
while (!Thread.interrupted()) {
    doWork();
}

注意:Thread.interrupted() 會清除當前執行緒中斷標記,連續呼叫第二次將回傳 false;isInterrupted() 僅查詢不清除。

中斷狀態管理

  • 設定:呼叫 interrupt()。
  • 查詢並清除:Thread.interrupted()。
  • 查詢不清除:thread.isInterrupted()。
  • 清除時機:
    • 拋出 InterruptedException 時自動清除。
    • 呼叫 Thread.interrupted() 時清除。

常見錯誤與正確模式

錯誤:吞沒 InterruptedException

// 錯誤示範
try { Thread.sleep(1000); } catch (InterruptedException e) { /* 什麼都不做 */ }

正確:恢復標記並傳播

try { Thread.sleep(1000); } 
catch (InterruptedException e) { 
    Thread.currentThread().interrupt(); // 關鍵:恢復中斷狀態
    throw new RuntimeException("執行緒被中斷", e); 
}

總結

掌握 interrupt() 的語義、中斷標記的生命週期、阻塞方法的差異響應,是編寫健壯多執行緒程式的基石。遵循「不吞沒中斷、正確傳播、使用框架取消 API」三原則,可避免多數併發 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved