1. 程式人生 > 其它 >【9001期】執行緒狀態及各狀態下與鎖和CPU的關係

【9001期】執行緒狀態及各狀態下與鎖和CPU的關係

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

吃水不忘挖井人: