執行緒的狀態轉換

2021-09-23 01:11:52 字數 966 閱讀 2007

執行緒的狀態有:new、runnable、running、waiting、timed_waiting、blocked、dead 

當執行new thread(runnabler)後,新建立出來的執行緒處於new狀態,這種執行緒不可能執行 

當執行thread.start()後,執行緒處於runnable狀態,這種情況下只要得到cpu,就可以開始執行了。runnable狀態的執行緒,會接受jvm的排程,進入running狀態,但是具體何時會進入這個狀態,是隨機不可知的 

running狀態中的執行緒最為複雜,可能會進入runnable、waiting、timed_waiting、blocked、dead狀態: 

如果cpu排程給了別的執行緒,或者執行了thread.yield()方法,則進入runnable狀態,但是也有可能立刻又進入running狀態 

如果執行了thread.sleep(long),或者thread.join(long),或者在鎖物件上呼叫object.wait(long)方法,則會進入timed_waiting狀態 

如果執行了thread.join(),或者在鎖物件上呼叫了object.wait()方法,則會進入waiting狀態 

如果進入了同步方法或者同步**塊,沒有獲取鎖物件的話,則會進入blocked狀態 

處於waiting狀態中的執行緒,如果是因為thread.join()方法進入等待的話,在目標thread執行完畢之後,會回到runnable狀態;如果是因為object.wait()方法進入等待的話,在鎖物件執行object.notify()或者object.notifyall()之後會回到runnable狀態 

處於timed_waiting狀態中的執行緒,和waiting狀態中的差不多,只不過是設定時間到了,就會回到runnable狀態 

處於blocked狀態中的執行緒,只有獲取了鎖之後,才會脫離阻塞狀態 

當執行緒執行完畢,或者丟擲了未捕獲的異常之後,會進入dead狀態,該執行緒結束

參考的資源:

執行緒的狀態轉換

執行緒的狀態轉換是執行緒控制的基礎。執行緒狀態總的可分為五大狀態 分別是生 死 可執行 執行 等待 阻塞。對於執行緒的阻止,考慮一下三個方面,不考慮io阻塞的情況 1.睡眠 2.等待 3.因為需要乙個物件的鎖定而被阻塞。睡眠 thread.sleep long millis 和thread.slee...

執行緒的狀態轉換

從執行緒被建立到執行完畢共經過了五個階段 新建 可執行 執行 等待 阻塞 睡眠 終止。關係圖如下所示 新狀態 new 執行緒以建立,但未呼叫任何方法 可執行狀態 runnable 已呼叫start 方法,進入就緒狀態,或程式剛從等待 阻塞 睡眠狀態回來,等待執行 執行狀態 run 程式在正常執行 等...

執行緒的狀態轉換

注 拿到物件的鎖標記,即為獲得了對該物件 臨界區 的使用許可權。即該執行緒獲得了執行所需的資源,進入 就緒狀態 只需獲得cpu,就可以執行。因為當呼叫wait 後,執行緒會釋放掉它所占有的 鎖標誌 所以執行緒只有在此獲取資源才能進入就緒狀態。停止執行緒 flag標誌 不推薦使用jdk提供的stop ...