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

Java 線程狀態轉換圖解:從 NEW 到 TERMINATED 的完整生命週期

     編輯:Java 相關知識

理解線程狀態機是寫好併發程式、排查死鎖/活鎖/飢餓的基石。JDK 定義 6 大狀態(Thread.State 枚舉),轉換觸發條件如下:

六大狀態定義

  • NEW:new Thread() 創建,未 start()。
  • RUNNABLE:調用 start() 後,就緒/運行中(OS 調度決定)。
  • BLOCKED:等待進入 synchronized 同步塊/方法,獲取鎖失敗。
  • WAITING:無限期等待,Object.wait()、Thread.join()、LockSupport.park()。
  • TIMED_WAITING:帶超時等待,sleep()、wait(timeout)、join(timeout)、parkNanos/parkUntil。
  • TERMINATED:run() 正常返回或拋出未捕獲異常結束。

狀態轉換觸發矩陣

從狀態觸發動作到狀態
NEWthread.start()RUNNABLE
RUNNABLE進入 synchronized 獲取鎖失敗BLOCKED
RUNNABLEObject.wait() / Thread.join() / LockSupport.park()WAITING
RUNNABLEThread.sleep() / wait(timeout) / join(timeout) / parkNanos()TIMED_WAITING
BLOCKED獲得鎖RUNNABLE
WAITINGObject.notify()/notifyAll() / LockSupport.unpark() / join 線程結束RUNNABLE
TIMED_WAITING超時 / notify / unpark / join 線程結束RUNNABLE
RUNNABLE/WAITING/TIMED_WAITING/BLOCKEDrun() 結束或拋出未捕獲異常TERMINATED

關鍵區別:BLOCKED vs WAITING

  • BLOCKED:主動嘗試進入臨界區,因鎖被佔用而被動掛起。**不釋放已持有的鎖**。
  • WAITING/TIMED_WAITING:主動釋放 CPU 與**已持有的鎖**(wait() 必須在同步塊內調用),等待外部通知。

圖示

Thread State Diagram

實戰診斷技巧

  1. jstack / VisualVM 觀察線程狀態分佈,大量 BLOCKED 提示鎖爭用,大量 WAITING 可能是連接池/任務佇列空閒。
  2. 死鎖特徵:多線程互相 BLOCKED,各持有對方需求的鎖。
  3. 線程泄漏:TERMINATED 線程數持續增長,或守護線程未正確關閉。

將狀態圖貼在工位,併發除錯不再盲目。

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