【9001期】執行緒狀態及各狀態下與鎖和CPU的關係
阿新 • • 發佈:2021-12-18
Thread.State列舉型別中定義了執行緒的六種狀態:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING和TERMINATED。
執行緒在某一時刻只能擁有一種狀態,但是線上程的整個生命週期,執行緒的狀態會發生變化。
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
各個狀態的說明:
- NEW:執行緒已經被建立,但還沒呼叫start()。此時的執行緒是不可執行的,CPU將不會為其分配時間。
- RUNNABLE:當新建立的執行緒呼叫了start(),執行緒便進入了RUNNABLE狀態。RUNNABLE狀態是指可以獲得CPU執行時間的狀態,如果執行緒在此狀態下,執行緒有兩種子狀態,一種是等待CPU時間,另一種是獲得了CPU時間在執行程式碼。
- BLOCKED:執行緒無法獲取物件鎖時的狀態。此狀態下執行緒會阻塞,當執行緒成功獲取到鎖,執行緒將切換為RUNNABLE狀態。BLOCKED狀態無法獲得CPU執行時間。
- WAITING:指執行緒在執行過程中,主動出讓自己CPU執行時間,讓其他執行緒先執行,自己等待其它執行緒的特定操作後再恢復執行。
- TIMED_WAITING:TIMED_WAITING和WAITING狀態相似,TIMED_WAITING增加了時間限制,其實沒有外部訊號,在等待時間超時後,執行緒也會恢復。
- TERMINATED:執行緒的終止態,當執行緒執行完自己的任務,或在執行任務中發生了異常,執行緒都會進入TERMINATED,表示執行緒已經到了生命週期的末尾。
下圖是關於執行緒間各狀態切換的過程及發生狀態切換的一些條件。
操作 | 操作前執行緒狀態 | 操作後執行緒狀態 | 是否出讓CPU時間 | 是否需要先持有物件鎖 | 是否釋放物件鎖 |
---|---|---|---|---|---|
new Thread() | 無 | NEW | 否 | 否 | 否 |
Thread.start() | NEW | RUNNABLE | 否 | 否 | 否 |
synchronized能得到物件鎖 | RUNNABLE | RUNNABLE | 否 | 否 | 否 |
synchronized無法得到物件鎖 | RUNNABLE | BLOCKED | 是 | 否 | 否 |
Thread.join() | RUNNABLE | WAITING | 是 | 否 | 否 |
Thread.join(t) | RUNNABLE | TIMED_WAITING | 是 | 否 | 否 |
Thread.sleep(t) | RUNNABLE | TIMED_WAITING | 是 | 否 | 否 |
Object.wait() | RUNNABLE | WAITING | 是 | 是 | 是 |
Object.wait(t) | RUNNABLE | TIMED_WAITING | 是 | 是 | 是 |
Object.notify() / Object.notifyAll() | RUNNABLE | RUNNABLE | 否 | 是 | 否 |
Lock.lock() | RUNNABLE | WAITING | 是 | 否 | 否 |
Lock.tryLock(t) | RUNNABLE | TIMED_WAITING | 是 | 否 | 否 |
LockSupport.park() | RUNNABLE | WAITING | 是 | 否 | 否 |
LockSupport.parkNanos(t)/LockSupport.parkUntil(t) | RUNNABLE | TIMED_WAITING | 是 | 否 | 否 |
執行結束/執行異常 | RUNNABLE | TERMINATED | 是 | 否 | 否 |
吃水不忘挖井人: |