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

線程會由出生 到運行 再到 死亡。在前文中曾經講到過(尋找前文請點這里):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)線程一旦啟動,大家都是獨立的處理,並不會因為父線程(創建並啟動子線程的線程)出現某種狀態,而影響到自身(如父線程死亡后,子線程仍然會繼續運行)。