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

Java 併發編程實例(五):線程休眠與中斷恢復機制

     編輯:Java 相關知識

案例背景

演示一個線程定時輸出當前時間,主線程啟動 5 秒後中斷該線程,觀察 TimeUnit.sleep() 拋出 InterruptedException 後的恢復流程。

核心類:FileClock

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()
            }
        }
    }
}

主程序:FileMain

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.

關鍵點解析

  1. TimeUnit.SECONDS.sleep(1) 會拋出 InterruptedException,這是 Java 並發 API 的標準中斷響應點。
  2. 捕獲異常後,線程必須決定後續行為:退出、重試、或重新設置中斷標誌(Thread.currentThread().interrupt())供上層調用者感知。
  3. 主線程調用 thread.interrupt() 僅設置中斷標誌,不會強制終止線程,協作式中斷是 Java 設計哲學。

最佳實踐建議

  • 在 catch (InterruptedException e) 塊中,若不打算繼續執行,調用 Thread.currentThread().interrupt() 保留中斷狀態。
  • 避免在 catch 中直接 return 而不處理中斷標誌,除非確定是頂層任務。
  • 使用 TimeUnit 代替 Thread.sleep(),語義更清晰,單位更直觀。

擴展思考

若需線程被中斷後繼續運行(而非退出),可在捕獲異常後記錄日誌並繼續循環,但需根據業務判斷是否合理。例如:心跳檢測線程被中斷可能意味著關閉信號,應退出;而計算任務可能選擇重試。

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