線程:狀態

一個線程只能處於一種狀態,並且這裏的線程狀態特指 Java 虛擬機的線程狀態,不能反映線程在特定操作系統下的狀態。

新建(NEW)

創建後尚未啓動。

可運行(RUNABLE)

正在 Java 虛擬機中運行。但是在操作系統層面,它可能處於運行狀態,也可能等待資源調度(例如處理器資源),資源調度完成就進入運行狀態。所以該狀態的可運行是指可以被運行,具體有沒有運行要看底層操作系統的資源調度。

阻塞(BLOCKED)

請求獲取 monitor lock 從而進入 synchronized 函數或者代碼塊,但是其它線程已經佔用了該 monitor lock,所以處於阻塞狀態。要結束該狀態進入 RUNABLE 需要其他線程釋放 monitor lock。

無限期等待(WAITING)

等待其它線程顯式地喚醒

注:

阻塞和等待的區別在於,阻塞是被動的,它是在等待獲取 monitor lock。而等待是主動的,通過調用 Object.wait() 等方法進入。

進入方法 退出方法
沒有設置 Timeout 參數的 Object.wait() 方法 Object.notify() / Object.notifyAll()
沒有設置 Timeout 參數的 Thread.join() 方法 被調用的線程執行完畢
LockSupport.park() 方法 LockSupport.unpark()

限期等待(TIMED_WAITING)

無需等待其它線程顯式地喚醒,在一定時間之後會被系統自動喚醒

進入方法 退出方法
Thread.sleep() 方法 時間結束
設置了 Timeout 參數的 Object.wait() 方法 時間結束 / Object.notify() / Object.notifyAll()
設置了 Timeout 參數的 Thread.join() 方法 時間結束 / 被調用的線程執行完畢
LockSupport.parkNanos() 方法 LockSupport.unpark()
LockSupport.parkUntil() 方法 LockSupport.unpark()

調用 Thread.sleep() 方法使線程進入限期等待狀態時,常常用“使一個線程睡眠”進行描述。調用 Object.wait() 方法使線程進入限期等待或者無限期等待時,常常用“掛起一個線程”進行描述。睡眠和掛起是用來描述行爲,而阻塞和等待用來描述狀態。

死亡(TERMINATED)

可以是線程結束任務之後自己結束,或者產生了異常而結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章