Java 執行緒的五種狀態本質上繼承自作業系統進程管理理論。本文從進程控制塊(PCB)、狀態轉換原語、三級排程、同步互斥機制、死鎖條件等核心概念切入,建立完整的並發基礎知識體系。
| 狀態 | 定義 | 進入條件 | 離開條件 |
|---|---|---|---|
| 初始態 | 進程剛建立,資源未就緒 | 建立進程 | 獲得資源,進入就緒隊列 |
| 就緒態 | 已獲除 CPU 外所有資源,等待排程 | 初始化完成 / 時間片用完 / 釋放鎖 / I/O 完成 | 被排程器選中,獲得 CPU |
| 執行態 | 佔用 CPU 正在執行 | 就緒態被排程 | 時間片用完 / 主動阻塞 / 更高優先級搶佔 / 結束 |
| 等待態(阻塞) | 等待事件(I/O、鎖、訊號) | 執行態呼叫阻塞原語 | 事件發生,喚醒原語,進入就緒隊列 |
| 終止態 | 執行結束或異常退出 | 程式正常結束 / 錯誤 / 被殺掉 | 資源回收,PCB 釋放 |
分配 CPU 能否立即執行? 能 → 就緒態;否 → 等待態(仍缺資源或事件)。
| 層級 | 名稱 | 頻率 | 功能 | 對象 |
|---|---|---|---|---|
| 高級 | 作業排程 | 幾分鐘一次 | 從外存選作業入記憶體,建立進程 | 作業 |
| 中級 | 交換排程 | 中等 | 外存對換區與記憶體間調度進程 | 進程 |
| 低級 | 進程排程 | 幾十毫秒一次 | 從就緒隊列選進程佔用 CPU | 進程 |
不允許多進程交叉執行的程式段(必須一次執行完,不可中斷)。
sem >= 0:可用資源數;sem < 0:等待進程數(絕對值)。sem--;若 >=0 繼續執行,若 <0 阻塞進入等待隊列。sem++;若 >0 結束;若 <=0 從等待隊列喚醒一進程。處理方法:預防(破壞條件)、避免(銀行家演算法)、檢測與解除、鴕鳥演算法(忽略,如大多數通用 OS)。
| 進程狀態 | Java Thread 狀態 | 對應方法/情境 |
|---|---|---|
| 初始態 | NEW | new Thread(),未 start() |
| 就緒態 | RUNNABLE | start() 後、yield()、鎖釋放、I/O 完成 |
| 執行態 | RUNNABLE (running) | 獲得 CPU 執行 run() |
| 等待態 | BLOCKED / WAITING / TIMED_WAITING | synchronized 等鎖 / wait() / sleep() / join() |
| 終止態 | TERMINATED | run() 結束 / 異常拋出 |
核心啟示:理解作業系統層面的進程模型,能讓你更深刻掌握 Java 並發套件(java.util.concurrent)的設計哲學——鎖、Condition、Semaphore、ThreadPool 皆是對這些經典理論的工程化封裝。