執行緒生命周期
結尾有
彩蛋哦
多執行緒常見面試問題
- 呼叫
new方法創建執行緒時,執行緒就創建了嗎? - 呼叫
start方法后,執行緒就被執行了嗎? - 執行緒是能從
BLOCKED狀態直接進入RUNNING狀態嗎? - 執行緒可以從
TERMINATED狀態轉換為其他狀態嗎?
執行緒生命周期狀態轉化圖

根據執行緒的生命周期,可以分為5個狀態,但是如果從編程角度分析:有另一個版本的執行緒狀態分類
- NEW(創建狀態)
- RUNNABLE(可執行狀態)
- RUNNING(執行狀態)
- BLOCKED(阻塞狀態)
- TERMINATED(死亡狀態)
NEW(創建)狀態
當使用new關鍵字創建一個執行緒物件時,此時執行緒并不是可執行狀態,因為這時候還沒有呼叫start方法,這個時候的執行緒處于NEW狀態,
此時執行緒是不存在的,對,這個時候應該說只是創建了一個執行緒物件,并沒有創建執行緒(第一個問題答案),
NEW狀態的執行緒只可以通過start方法進入RUNNABLE狀態,只能進入RUNNABLE狀態,不能進入RUNNING狀態(實際上RUNNING狀態可以看成一種特殊的RUNNABLE狀態),
RUNNABLE(可執行)狀態
通過呼叫start方法執行緒物件進入RUNNABLE狀態,這個時候JVM才會正在的去創建執行緒,但是此時執行緒沒有被立即執行,或者說不能被立即執行(第二個問題答案),執行緒是否被執行取決于能否得到CPU的調度,
也是由于這個原因,執行緒無法從new狀態直接進入RUNNING狀態,即便得到調度的時間很短,
另外,RUNNABLE狀態的執行緒是不能直接進入BLOCKED狀態的,
排除意外終止的情況,RUNNABLE狀態的執行緒只能進入RUNNING狀態,原因很簡單,即便我們呼叫了wait,sleep或者其他的執行緒操作,這些操作也必須得到CPU調度才能生效,一旦執行緒得到CPU調度,執行緒的狀態也就從RUNNABLE轉換為了RUNNING,
RUNNING(執行)狀態
一旦CPU從任務的可執行佇列里選中了執行緒,執行緒這時候就轉換為了RUNNING狀態,也是這時候才開始執行自己的邏輯代碼(包括wait,sleep等方法),
RUNNING狀態的執行緒可以發生如下幾種情況的轉換:
- 主動進入
BLOCKED狀態,例如:通過呼叫sleep或者wait方法,執行緒被加入到waitSet中, - 被動進入
BLOCKED狀態,例如:獲取鎖資源,或者遇到阻塞IO操作等 - 進入
TERMINATED狀態,例如:呼叫了stop方法(該方法已經不推薦使用)或者意外中斷, - 主動進入
RUNNABLE狀態,呼叫yield方法放棄CPU的執行權, - 被動進入
RUNNABLE狀態,CPU調度器放棄了該執行緒的執行權,
這個佇列就是
ThreadGroup,它非常重要
說到這個
waitSet,上面說如果按照編程角度來看,還有其他的一種為執行緒分類的方式,而在waitSet中的執行緒在那種分類方式中叫Timed Waiting(限期等待)
BLOCKED(阻塞)狀態
上面已經闡述了執行緒如何進入BLOCKED狀態,接下來就聊一下執行緒可以從BLOCKED狀態切換到哪些狀態:
- 進入
TERMINATED狀態,例如:呼叫了stop方法(該方法已經不推薦使用)或者意外中斷(例如:JVM Crash導致所有執行緒結束), - 執行緒阻塞操作結束,進入
RUNABLE狀態, - 執行緒休眠結束,進入
RUNNABLE狀態 - wait 中的執行緒被其他執行緒呼叫
notify或notifyall喚醒,進入RUNNABLE狀態 - 執行緒得到鎖資源,進入
RUNNABLE狀態, - 其他執行緒呼叫了
interrupt方法,執行緒進入RUNNABLE狀態
執行緒是不能從
BLOCKED狀態直接進入RUNNING狀態的,(問題3)
TERMINATED(終止)狀態
先回答一下上面第四個的問題,執行緒是不能從TERMINATED狀態轉換為其他狀態的,TERMINATED是執行緒的最終狀態,執行緒進入該狀態意味著執行緒的整個生命周期結束,
彩蛋

超神學院語錄
我心存彥,吾彥永恒
留下一個問題:
Thread中的start和run方法是什么關系?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278419.html
標籤:其他
下一篇:報文如何丟棄 如何處理
