演示一個線程定時輸出當前時間,主線程啟動 5 秒後中斷該線程,觀察 TimeUnit.sleep() 拋出 InterruptedException 後的恢復流程。
package com.diguage.books.concurrencycookbook.chapter1.recipe5;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class FileClock implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.printf("%s%n", new Date());
try {
TimeUnit.SECONDS.sleep(1); // 休眠 1 秒
} catch (InterruptedException e) {
System.out.printf("The FileClock has been interrupted.%n");
// 此處可做清理,然後決定是否退出或繼續
return; // 示例選擇直接退出 run()
}
}
}
}
package com.diguage.books.concurrencycookbook.chapter1.recipe5;
import java.util.concurrent.TimeUnit;
public class FileMain {
public static void main(String[] args) {
FileClock clock = new FileClock();
Thread thread = new Thread(clock);
thread.start();
try {
TimeUnit.SECONDS.sleep(5); // 主線程等待 5 秒
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt(); // 中斷子線程
}
}
Tue Nov 18 10:00:00 CST 2025
Tue Nov 18 10:00:01 CST 2025
Tue Nov 18 10:00:02 CST 2025
Tue Nov 18 10:00:03 CST 2025
Tue Nov 18 10:00:04 CST 2025
The FileClock has been interrupted.
TimeUnit.SECONDS.sleep(1) 會拋出 InterruptedException,這是 Java 並發 API 的標準中斷響應點。Thread.currentThread().interrupt())供上層調用者感知。thread.interrupt() 僅設置中斷標誌,不會強制終止線程,協作式中斷是 Java 設計哲學。catch (InterruptedException e) 塊中,若不打算繼續執行,調用 Thread.currentThread().interrupt() 保留中斷狀態。catch 中直接 return 而不處理中斷標誌,除非確定是頂層任務。TimeUnit 代替 Thread.sleep(),語義更清晰,單位更直觀。若需線程被中斷後繼續運行(而非退出),可在捕獲異常後記錄日誌並繼續循環,但需根據業務判斷是否合理。例如:心跳檢測線程被中斷可能意味著關閉信號,應退出;而計算任務可能選擇重試。