一、線程狀態轉換
?
新建(New)
創建后尚未啟動。
可運行(Runnable)
可能正在運行,也可能正在等待 CPU 時間片。
包含了操作系統線程狀態中的 Running 和 Ready。
阻塞(Blocking)
等待獲取一個排它鎖,如果其線程釋放了鎖就會結束此狀態。
無限期等待(Waiting)
等待其它線程顯式地喚醒,否則不會被分配 CPU 時間片。
進入方法 | 退出方法 |
---|---|
沒有設置 Timeout 參數的 Object.wait() 方法 | Object.notify() / Object.notifyAll() |
沒有設置 Timeout 參數的 Thread.join() 方法 | 被調用的線程執行完畢 |
LockSupport.park() 方法 | - |
限期等待(Timed Waiting)
無需等待其它線程顯式地喚醒,在一定時間之后會被系統自動喚醒。
調用 Thread.sleep() 方法使線程進入限期等待狀態時,常常用“使一個線程睡眠”進行描述。
調用 Object.wait() 方法使線程進入限期等待或者無限期等待時,常常用“掛起一個線程”進行描述。
睡眠和掛起是用來描述行為,而阻塞和等待用來描述狀態。
阻塞和等待的區別在于,阻塞是被動的,它是在等待獲取一個排它鎖。而等待是主動的,通過調用 Thread.sleep() 和 Object.wait() 等方法進入。
進入方法 | 退出方法 |
---|---|
Thread.sleep() 方法 | 時間結束 |
設置了 Timeout 參數的 Object.wait() 方法 | 時間結束 / Object.notify() / Object.notifyAll() |
設置了 Timeout 參數的 Thread.join() 方法 | 時間結束 / 被調用的線程執行完畢 |
LockSupport.parkNanos() 方法 | - |
LockSupport.parkUntil() 方法 | - |
死亡(Terminated)
可以是線程結束任務之后自己結束,或者產生了異常而結束。
來源:https://github.com/CyC2018/CS-Notes/tree/master/notes