Java多線程開發系列之三:線程這一輩子(線程的生命周期)


       前文中已經提到了,關於多線程的基礎知識和多線程的創建。但是如果想要很好的管理多線程,一定要對線程的生命周期有一個整體概念。本節即對線程的一生進行介紹,讓大家對線程的各個時段的狀態有一定了解。


線程的一生的狀態過程

如下圖:

 

         
線程會由出生 到運行  再到 死亡。在前文中曾經講到過(尋找前文請點這里):java中各個線程是搶占式的:cpu一般不會為一個線程從出生一直服務到老,各個線程總是爭搶的希望得到cpu的“青睞”。當某個線程發生阻塞時,那么cpu就會被其他線程迅速搶占。而當前阻塞的線程只能變為就緒狀態,等待cpu下次的“垂青”。這里有句老話挺符合的:機會總是留給有准備的人的(當前處於就緒狀態的),如果你還沒准備好(阻塞),機會就轉瞬即逝了(轉向其他線程了)。
所以如上圖所示:(防盜連接:本文首發自王若伊_恩賜解脫http://www.cnblogs.com/jilodream/ )
      線程在出生后(被new出來以后)即為新建狀態,此時jvm會為其分配內存、初始化字段,僅此。然后進入就緒狀態(執行Start方法)開始排隊,緊接着當cpu開始執行(搶占到資源)該線程,線程進入運行狀態,接着由於某種原因需要等待(如睡眠,等待需要調用的資源(如被其它資源占用,或者開啟需要准備時間))而被迫進入阻塞狀態。待等待結束后(睡眠時間到后、等待資源被釋放)線程會再次進入就緒狀態,等待着cpu的再次垂青。於此同時如果運行狀態中的線程由於cpu調度的問題,而失去運行權利后也會被變為就緒狀態,等待cpu的再次降臨。當運行中的線程執行完線程體中的任務后、或者由於某種異常而掛起后,該線程就會進入死亡狀態

狀態跳轉詳解:
在上圖中各個步驟(途中數字)代表的情況
新建New---->就緒Runnable 運行Start()方法
就緒Runnable---->運行Running 獲得cpu資源
運行Running---->阻塞Blocked

進入睡眠、

被掛起、

等待其他資源、

等待某個通知(后文會講到)、

等待某個IO資源

阻塞Blocked---->就緒Runnable

睡眠時間到、

掛起后被重新恢復、

等待資源已經被釋放、

獲取到其他線程的通知(后文會講到)、

IO方法已經返回

運行Running---->就緒Runnable

處理器放棄當前線程,處理其他線程去了

運行Running---->死亡Dead

 當前線程的執行體已經被運行結束、

當前線程拋出了無法解決的異常或錯誤


其它一些需要注意的地方:

(1)線程啟動后,並不會立刻運行,具體運行時間要看虛擬機的調度(前文中有講)

(2)線程一旦死亡就不能再重新啟動就緒(使用Start方法),如果強制啟動會拋出異常。

(3)想判斷當前的線程是否已經被啟動並且還未死亡(就緒、運行、阻塞),可以使用isAlive()方法判斷

(4)啟動線程進入就緒狀態請務必使用Start()方法啟動,而非Run方法,原因在創建多線程時也曾經講過。

(5)線程一旦啟動,大家都是獨立的處理,並不會因為父線程(創建並啟動子線程的線程)出現某種狀態,而影響到自身(如父線程死亡后,子線程仍然會繼續運行)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM