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

Java 線程控制實戰:sleep、join、yield、守護線程與中斷機制

     編輯:Java 綜合教學

Java 線程控制實戰:sleep、join、yield、守護線程與中斷機制

掌握線程控制方法是編寫健壯並發程序的前提。本文通過五個核心 API(sleep、join、yield、setDaemon、interrupt)的原理、代碼示例與注意事項,幫助開發者精準控制線程生命周期與協作。

1. 線程休眠 Thread.sleep(millis)

  • 靜態方法,讓當前執行線程暫停指定毫秒
  • 拋出 InterruptedException 需捕獲
  • 不釋放鎖(若持有 synchronized 鎖)
public void run() {
    for (int i = 0; i < 100; i++) {
        System.out.println(getName() + ":" + i);
        try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }
    }
}

2. 線程加入 join()

  • 調用線程等待目標線程終止
  • 常用於主線程等待子線程完成初始化任務
t1.start();
try { t1.join(); } catch (InterruptedException e) { e.printStackTrace(); }
t2.start(); t3.start(); // t2/t3 在 t1 結束後才啟動

3. 線程禮讓 Thread.yield()

  • 當前線程主動放棄 CPU,回到就緒隊列
  • 不保證下次調度選中其他線程,僅作「禮讓」語義
  • 不可依賴實現嚴格輪轉

4. 守護線程 setDaemon(true)

  • JVM 僅剩守護線程時自動退出
  • 必須在 start() 前調用
  • 典型用途:GC 線程、監控線程、心跳檢測
Thread t = new Thread(() -> { while(true) { /* 監控邏輯 */ } });
t.setDaemon(true); // 標記為守護線程
t.start();

5. 線程中斷 interrupt() vs stop()

方法狀態機制推薦度
stop()已棄用強制殺死,釋放所有鎖,數據易損壞❌ 禁止
interrupt()標準設置中斷標誌;阻塞方法拋出 InterruptedException✅ 推薦
// 正確中斷模式
public void run() {
    try {
        Thread.sleep(10000); // 可被中斷的阻塞點
    } catch (InterruptedException e) {
        System.out.println("線程被中斷,安全退出");
        return; // 或拋出異常向上傳播
    }
}

// 主線程中斷
thread.start();
Thread.sleep(3000);
thread.interrupt(); // 設置中斷標誌,喚醒 sleep

核心最佳實踐

  1. 優先使用 interrupt() 協作式取消,避免 stop()
  2. 捕獲 InterruptedException 後:要么清理資源返回,要么重新設置中斷標誌 Thread.currentThread().interrupt()
  3. 守護線程不用于關鍵業務邏輯,防止數據未持久化 JVM 退出
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved