1. 程式人生 > >執行緒的狀態轉換圖

執行緒的狀態轉換圖

執行緒在一定條件下。狀態會發生變化。

執行緒變化的狀態轉換圖例如以下:

  1、新建狀態(New):新建立了一個執行緒物件。

  2、就緒狀態(Runnable):執行緒物件建立後,其它執行緒呼叫了該物件的start()方法。

該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取CPU的使用權。

  3、執行狀態(Running):就緒狀態的執行緒獲取了CPU。執行程式程式碼。

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

堵塞的情況分三種:

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

  (二)、同步堵塞:執行的執行緒在獲取物件的同步鎖時,若該同步鎖被別的執行緒佔用。則JVM會把該執行緒放入鎖池中。

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

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

小小的作下解釋:
1、執行緒的實現有兩種方式,一是繼承Thread類,二是實現Runnable介面,但無論如何,當我們new了這個物件後。執行緒就進入了初始狀態;
2、當該物件呼叫了start()方法,就進入可執行狀態;
3、進入可執行狀態後,當該物件被作業系統選中。獲得CPU時間片就會進入執行狀態;
4、進入執行狀態後情況就比較複雜了
    4.1、run()方法或main()方法結束後,執行緒就進入終止狀態;
    4.2、當執行緒呼叫了自身的sleep()方法或其它執行緒的join()方法,就會進入堵塞狀態(該狀態既停止當前執行緒,但並不釋放所佔有的資源)。當sleep()結束或join()結束後。該執行緒進入可執行狀態,繼續等待OS分配時間片;
    4.3、執行緒呼叫了yield()方法,意思是放棄當前獲得的CPU時間片,回到可執行狀態,這時與其它程序處於同等競爭狀態,OS有可能會接著又讓這個程序進入執行狀態。
   4.4、當執行緒剛進入可執行狀態(注意,還沒執行),發現將要呼叫的資源被synchroniza(同步),獲取不到鎖標記。將會馬上進入鎖池狀態,等待獲取鎖標記(這時的鎖池裡或許已經有了其它執行緒在等待獲取鎖標記,這時它們處於佇列狀態,既先到先得),一旦執行緒獲得鎖標記後,就轉入可執行狀態。等待OS分配CPU時間片。
   4.5、當執行緒呼叫wait()方法後會進入等待佇列(進入這個狀態會釋放所佔有的全部資源,與堵塞狀態不同)。進入這個狀態後。是不能自己主動喚醒的,必須依靠其它執行緒呼叫notify()或notifyAll()方法才幹被喚醒(因為notify()僅僅是喚醒一個執行緒,但我們由不能確定詳細喚醒的是哪一個執行緒。或許我們須要喚醒的執行緒不可以被喚醒,因此在實際使用時,一般都用notifyAll()方法,喚醒有所執行緒),執行緒被喚醒後會進入鎖池。等待獲取鎖標記。