執行緒的五種狀態
1.執行緒的五種狀態
執行緒的狀態在 JDK 1.5 之後以枚舉的方式被定義在 Thread 的源碼中,它總共包含以下 6
個狀態:
- NEW,新建狀態,執行緒被創建出來,但尚未啟動時的執行緒狀態;
-** RUNNABLE**,就緒狀態,表示可以運行的執行緒狀態,它可能正在運行,或者是在排隊等待作業系統給它分配
CPU 資源;
-
BLOCKED,阻塞等待鎖的執行緒狀態,表示處於阻塞狀態的執行緒正在等待監視器鎖,比如等待執行
synchronized 程式碼塊或者使用 synchronized 標記的方法; -
WAITING,等待狀態,一個處於等待狀態的執行緒正在等待另一個執行緒執行某個特定的動作,比如,一個執行緒調用了
Object.wait() 方法,那它就在等待另一個執行緒調用 Object.notify() 或
Object.notifyAll() 方法; -
TIMED_WAITING,計時等待狀態,和等待狀態(WAITING)類似,它只是多了超時時間,比如調用了有超時時間設置的方法
Object.wait(long timeout) 和 Thread.join(long timeout)
等這些方法時,它才會進入此狀態; -
TERMINATED,終止狀態,表示執行緒已經執行完成。
執行緒狀態的源程式碼如下:
public enum State {
/**
* 新建狀態,執行緒被創建出來,但尚未啟動時的執行緒狀態
*/
NEW,
/**
* 就緒狀態,表示可以運行的執行緒狀態,但它在排隊等待來自作業系統的 CPU 資源
*/
RUNNABLE,
/**
* 阻塞等待鎖的執行緒狀態,表示正在處於阻塞狀態的執行緒
* 正在等待監視器鎖,比如等待執行 synchronized 程式碼塊或者
* 使用 synchronized 標記的方法
*/
BLOCKED,
/**
* 等待狀態,一個處於等待狀態的執行緒正在等待另一個執行緒執行某個特定的動作。
* 例如,一個執行緒調用了 Object.wait() 它在等待另一個執行緒調用
* Object.notify() 或 Object.notifyAll()
*/
WAITING,
/**
* 計時等待狀態,和等待狀態 (WAITING) 類似,只是多了超時時間,比如
* 調用了有超時時間設置的方法 Object.wait(long timeout) 和
* Thread.join(long timeout) 就會進入此狀態
*/
TIMED_WAITING,
/**
* 終止狀態,表示執行緒已經執行完成
*/
}
執行緒的工作模式是,首先先要創建執行緒並指定執行緒需要執行的業務方法,然後再調用執行緒的
start() 方法,此時執行緒就從 NEW(新建)狀態變成了
RUNNABLE(就緒)狀態,此時執行緒會判斷要執行的方法中有沒有 synchronized
同步程式碼塊,如果有並且其他執行緒也在使用此鎖,那麼執行緒就會變為
BLOCKED(阻塞等待)狀態,當其他執行緒使用完此鎖之後,執行緒會繼續執行剩餘的方法。
當遇到 Object.wait() 或 Thread.join() 方法時,執行緒會變為
WAITING(等待狀態)狀態,如果是帶了超時時間的等待方法,那麼執行緒會進入
TIMED_WAITING(計時等待)狀態,當有其他執行緒執行了 notify() 或notifyAll()
方法之後,執行緒被喚醒繼續執行剩餘的業務方法,直到方法執行完成為止,此時整個執行緒的流程就執行完了,執行流程如下圖所示: