JAVA執行緒間的狀態轉換

2021-08-07 12:25:45 字數 1513 閱讀 5617

執行緒間的狀態轉換:

1. 新建(new)

:新建立了乙個執行緒物件。

2. 可執行/就緒(runnable)

:執行緒物件建立後,其他執行緒(比如main執行緒)呼叫了該物件的start()方法。該狀態的執行緒位於可執行執行緒池中,等待被執行緒排程選中,獲取cpu 的使用權 。

3. 執行(running)

:可執行狀態(

runnable)

的執行緒獲得了cpu 時間片(timeslice) ,執行程式**。

4. 阻塞(block)

:阻塞狀態是指執行緒因為某種原因放棄了cpu 使用權,也即讓出了cpu timeslice,暫時停止執行。直到執行緒進入

可執行(runnable)

狀態,才有機會再次獲得cpu timeslice 轉到

執行(running)

狀態。阻塞的情況分三種: 

(一). 等待阻塞:

執行(running)

的執行緒執行o.wait()方法,jvm會把該執行緒放入等待佇列(waitting queue)中。

(二). 同步阻塞:

執行(running)

的執行緒在獲取物件的同步鎖時,若該同步鎖被別的執行緒占用,則jvm會把該執行緒放入鎖池(lock pool)中。

(三). 其他阻塞:

執行(running)

的執行緒執行thread.sleep(long ms)或t.join()方法,或者發出了i/o請求時,jvm會把該執行緒置為阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者i/o處理完畢時,執行緒重新轉入

可執行(runnable)

狀態。5. 

死亡(dead)

:執行緒run()、main() 方法執行結束,或者因異常退出了run()方法,則該執行緒結束生命週期。死亡的執行緒不可再次復

補充:

sleep()方法和yield()方法都是thread類的靜態方法,都會使當前處於執行狀態的執行緒放棄cpu,把執行機會讓給別的執行緒。兩者的區別在於:

sleep()方法會給其他執行緒執行的機會,不考慮其他執行緒的優先順序,因此會給較低優先順序執行緒乙個執行的機會;yield()方法只會給相同優先順序或者更高優先順序的執行緒乙個執行的機會。

當執行緒執行了sleep(long millis)方法,將轉到阻塞狀態,引數millis指定睡眠時間;當執行緒執行了yield()方法,將轉到就緒狀態。

sleep()方法宣告丟擲interruptedexception異常,而yield()方法沒有宣告丟擲任何異常。

sleep()方法比yield()方法具有更好的可移植性。不能依靠yield()方法來提高程式的併發效能。對於大多數程式設計師來說,yield()方法的唯一用途是在測試期間人為地提高程式的併發效能,以幫助發現一些隱藏的錯誤。本章及第20章為了使得程式能增加出現預期執行效果的可能性,在一些例子中使用了yield()方法,這只是出於演示的需要,但在實際應用中不值得效仿。

JAVA執行緒間的狀態轉換

執行緒間的狀態轉換 1.新建 new 新建立了乙個執行緒物件。2.可執行 runnable 執行緒物件建立後,其他執行緒 比如main執行緒 呼叫了該物件的start 方法。該狀態的執行緒位於可執行執行緒池中,等待被執行緒排程選中,獲取cpu 的使用權 3.執行 running 可執行狀態 runn...

Java 執行緒的狀態轉換

執行緒可以分為4個狀態 new 新生 runnable 可執行 為了方便分析,還可將其分為 runnable與running。blocked 被阻塞 dead 死亡 img 1,新生線程 2,可執行執行緒 a runnable 一旦呼叫了start方法,就進入到runnable狀態。b runnin...

java 執行緒 執行緒的狀態及其狀態的轉換

new 新建立執行緒,初始態 runnable 可執行狀態,當前狀態的執行緒位於 可執行執行緒池 中,變得可執行,只等待獲取cpu的使用權,即當前執行緒獲得了除cpu以外的所有資源。running 正在執行。此時執行緒獲得了cpu的使用權,執行程式 blocked 阻塞狀態。執行緒因為某種原因放棄了...