執行緒的生命週期,及之間的轉換。

2021-10-08 20:48:00 字數 1520 閱讀 5488

1、執行緒的5種狀態:新建(new),就緒(runnable),執行(running),阻塞(blocked),死亡(dead)

(1)新建狀態(new):新建立了乙個執行緒物件。

(2)就緒狀態(runnable):執行緒物件建立後,其它執行緒呼叫了該物件的start()方法。該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取cpu的使用權。

(3)執行狀態(running):就緒狀態的執行緒獲取了cpu。執行程式**。

(4)堵塞狀態(blocked):堵塞狀態是執行緒由於某種原因放棄cpu使用權。臨時停止執行。直到執行緒進入就緒狀態,才有機會轉到執行狀態。

堵塞的情況分三種:

1)等待堵塞:執行的執行緒執行wait()方法,jvm會把該執行緒放入等待池中。

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

3)其它堵塞:執行的執行緒執行sleep()或join()方法,或者發出了i/o請求時。jvm會把該執行緒置為堵塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者i/o處理完成時。執行緒又一次轉入就緒狀態。

(5)死亡狀態(dead):執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期。

2、執行緒的生命週期**:

(1)執行緒的實現有兩種方式,一是繼承thread類,二是實現runnable介面,但無論如何,當我們 new了這個物件後。執行緒就進入了初始狀態;

(2)當該物件呼叫了start()方法,就進入可執行狀態;

(3)進入可執行狀態後,當該物件被作業系統選中。獲得cpu時間片就會進入執行狀態;

(4)進入執行狀態後情況就比較複雜了

1)run()方法或main()方法結束後,執行緒就進入終止狀態;

2)當執行緒呼叫了自身的sleep()方法或其它執行緒的join()方法,就會進入堵塞狀態(該狀態既停止當前執行緒,但並不釋放所占有的資源)。當sleep()結束或join()結束後。該執行緒進入可執行狀態,繼續等待os分配時間片;

3)執行緒呼叫了yield()方法,意思是放棄當前獲得的cpu時間片,回到可執行狀態,這時與其它程序處於同等競爭狀態,os有可能會接著又讓這個程序進入執行狀態;

4)當執行緒剛進入可執行狀態(注意,還沒執行),發現將要呼叫的資源被synchroniza(同步),獲取不到鎖標記。將會馬上進入鎖池狀態,等待獲取鎖標記(這時的鎖池裡或許已經有了其它執行緒在等待獲取鎖標記,這時它們處於佇列狀態,既先到先得),一旦執行緒獲得鎖標記後,就轉入可執行狀態。等待os分配cpu時間片;

5)當執行緒呼叫wait()方法後會進入等待佇列(進入這個狀態會釋放所占有的全部資源,與堵塞狀態不同)。進入這個狀態後。是不能自己主動喚醒的,必須依靠其它執行緒呼叫notify()或notifyall()方法才幹被喚醒(因為notify()僅僅是喚醒乙個執行緒,但我們由不能確定詳細喚醒的是哪乙個執行緒。或許我們須要喚醒的執行緒不可以被喚醒,因此在實際使用時,一般都用notifyall()方法,喚醒有所執行緒),執行緒被喚醒後會進入鎖池。等待獲取鎖標記。

執行緒的生命週期

1.新建 threadd thread new thread runnable 2.就緒 thread.start 將執行緒放入就緒等待佇列中,等待cpu時間片的分配 3.執行 獲取到cpu時間片,一直執行到結束,除非有優先順序更高執行緒進入或者自動放棄cpu資源 4.死亡 正常結束或被其他執行緒殺...

執行緒的生命週期

如上圖 new乙個thread,則執行緒處於新建狀態。呼叫start 則處於就緒狀態,至於什麼時候執行,屬於系統排程的事情了,當run 或者call 執行體執行完成後,處於死亡狀態。執行狀態的執行緒,可能遇到以下情況而被阻塞 sleep 方法 io阻塞 等待同步鎖 等待通知 suspend 呼叫yi...

執行緒的生命週期

執行緒的生命週期主要分為 新建 可執行 執行 阻塞 終止這幾個狀態。下面展現其狀態轉化框架圖。sleep 使比其優先順序低的執行緒執行 不占用cpu yield 只讓給同優先順序的縣城執行,將自己置於可執行執行緒池。物件鎖保持 join 形式 t.join 等待執行緒t結束,執行緒進入可執行狀態。i...