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

Java 線程生命周期(二):啟動、終止、暫停與善後完全指南

     編輯:Java 相關知識

線程從創建到消亡的完整生命周期管理,是併發編程的基礎功力。

核心階段

  1. NEW:new Thread() 創建
  2. RUNNABLE:start() 啟動,進入就緒隊列
  3. RUNNING:獲取 CPU 執行 run()
  4. BLOCKED/WAITING/TIMED_WAITING:同步阻塞、等待通知、定時等待
  5. TERMINATED:run() 正常返回或異常退出

isAlive():STARTED 且未 TERMINATED 返回 true。

終止線程:標記位 vs 中斷

標記位模式

private volatile boolean done = false;
public void run() {
    while (!done) {
        nextCharacter();
        try { Thread.sleep(getPauseTime()); }
        catch (InterruptedException ie) { return; }
    }
}
public void setDone() { done = true; }

缺點:輪詢延遲(最長等待 sleep 時間)。

中斷模式

public void run() {
    while (!Thread.currentThread().isInterrupted()) {
        nextCharacter();
        try { Thread.sleep(getPauseTime()); }
        catch (InterruptedException ie) { return; } // 異常即清除中斷狀態
    }
}
public void stopThread() { thread.interrupt(); }

interrupt() 兩大效果:

  1. 阻塞方法(sleep/wait/join)拋出 InterruptedException 並清除中斷標記
  2. 設置線程內部中斷標記(非阻塞時可用 isInterrupted() 檢查)

優勢:響應更及時,無需輪詢間隔。

暫停/恢復:廢棄 API 替代方案

  • suspend()/resume() 已廢棄(死鎖風險)
  • sleep():僅影響當前線程,非真正掛起
  • 正解:wait()/notify() 或 Condition.await()/signal() 實現外部可控掛起恢復

線程善後與狀態檢查

join() 等待終止

thread.join(); // 阻塞直到 run() 結束
thread.join(5000); // 超時版本

風險:首次調用可能長時間阻塞,生產環境常用 isAlive() 輪詢或 Future 模式。

Runnable 任務中檢查中斷

public void run() {
    while (!Thread.currentThread().isInterrupted()) { /* ... */ }
}

任務未綁定線程時,通過 Thread.currentThread() 獲取當前執行線程引用。

守護線程

setDaemon(true):JVM 僅剩守護線程時自動退出。適合後台服務(GC、監控)。

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