JAVA基礎 之 Thread的6種狀態

最近太忙,好久沒更新了,上次寫的是Tread源碼分析,這次再補上一個關於線程的幾種狀態吧。

 

線程狀態在Thread的源碼中有一個子枚舉state。裏面定義了6種狀態:

 

1,NEW

當我們新建一個線程對象時,此時線程是屬於這個狀態的。

 

2,Runnable

有了線程對象,當調用該線程的start()時,線程就從new轉變成runnable。表示該線程準備就緒,可以分配CPU運行。

但具體什麼時候運行,我們並不知道。

JVM中的runnable狀態和CPU中的狀態並不一樣。因爲現代CPU一般使用時間分片方式進行線程的調度。所以每個線程在CPU中執行的時間會很短。所以真正CPU中的線程狀態,會經常在ready,running,waiting中切換。比如當線程進行一個IO操作時,就會在CPU中將running切換到了waiting,等待IO結束,硬盤會給CPU一個callback,告訴他IO結束,這時候CPU纔會將waiting又轉換到ready重新進入調度隊列。但這對於JVM來說他並不關心這些。即使CPU將他放入waiting隊列,還是會有硬盤在爲這個線程執行一些內容。所以JVM只需要使用runnable表示即可。

 

3,Blocked

當A線程進入一個被synchronized修飾的方法或者代碼塊時,如果當前已經有B線程進入了,那麼A線程就會進入Blocked狀態。直到B線程釋放鎖。

 

4,waiting

當線程A中創建一個線程B,並且調用了b.join()方法時,A線程則需要等待B線程執行結束才繼續執行。這是主線程就是waiting狀態。或者是調用了wait方法後也會到waiting狀態。

 

5,timed_waiting

顧名思義,就是有時間限定的等待狀態。比如b.join(time),sleep(time);wait(time)都會進入這個狀態。

 

6,TERMINATED

中止狀態,當我們線程拋出異常或者執行結束進入此狀態。

 

這幾種狀態也組成了線程的生命週期。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章