java.lang.Thread.State 枚舉類型中(内部類形式),定義了線程的幾種狀态,其代碼為:
一個事物從出生的那一刻開始到最終死亡中間的整個過程.在事物的漫長的生命周期過程中,總會經曆不同的狀态(嬰兒狀态/青少年狀态/中年狀态/老年狀态...).線程也是有生命周期的,也是存在不同的狀态的,狀态互相之間的轉換.
NEW 建立
線程剛被建立,還沒調用start方法,或者剛剛調用了start方法,調用start方法不一定"立即"改變線程狀态,中間可能需要一些步驟才完成一個線程的啟動。
RUNNABLE 可行性
start方法調用結束,線程由NEW變成RUNNABLE,線程存活着,并嘗試搶占CPU資源,或者已經搶占到CPU資源正在運作,這倆種情況的狀态都顯示為RUNNABLE分别為:
1)就緒:等待配置設定時間片
2)運作:搶到CPU資源(配置設定到時間片)後執行代碼
BLOCKED 鎖阻塞
線程A和線程B都要執行方法test,而且方法test被加了鎖,線程A先拿到了鎖去執行test方法,線程B這時候需要等待線程A把鎖釋放。這時候線程B就是處理BLOCKED(鎖池)
WAITING 無限期等待
一個線程在等待另一個線程執行一個(喚醒)動作時,該線程進入Waiting狀态。進入這個狀态後是不能自動喚醒的,必須等待另一個線程調用notify或者notifyAll方法才能夠喚醒。還有join(無參)也會讓目前線程進入WAITING狀态
TIMED_WAITING 有限期等待
和WAITING狀态類似,但是有一個時間期限,時間到了,自己也會主動醒來(sleep、join(有參))
TERMINATED 終止(死亡)
run方法執行結束的線程處于這種狀态
作圖如下:
藍色字型部分表示線程目前狀态

需要注意的是:在一個同步代碼中,釋放鎖對象(鎖對象.wait())該線程進入wait等待區後是無法再對鎖對象進行操作的!!!是以notify()、notifyAll()要寫在鎖對象釋放之前,例如鎖對象調用notifyAll()後wait等待區中所有需要該鎖對象的線程被喚醒進入鎖池等待該鎖對象,然後才開始釋放鎖對象,JVM将随機從鎖池中挑選一個需要該鎖對象的線程進入就緒狀态