一個線程只能處於一種狀態,並且這裏的線程狀態特指 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)
可以是線程結束任務之後自己結束,或者產生了異常而結束。