本篇屬于【Java多線程系列】文章第二章【多線程編程的實現與應用】的第二小節內容,我們會來學習線程的生命周期,作為面試的常見問題,我們必須對它有比較好的理解,同時也是后續知識學習的前提條件。
線程的生命周期一共分為五個部分,分別是:新建,就緒,運行,阻塞以及終止。由于CPU需要在多條線程中切換因此線程狀態也會在多次運行和阻塞之間切換
新建(New)
當程序使用new關鍵字創建了一個線程之后,該線程就處于一個新建狀態(初始狀態),此時它和其他Java對象一樣,僅僅由Java虛擬機為其分配了內存,并初始化了其成員變量值。此時的線程對象沒有表現出任何線程的動態特征,程序也不會執行線程的線程執行體。
就緒(Runnable)
當線程對象調用了Thread.start()方法之后,該線程處于就緒狀態,Java虛擬機會為其創建方法調用棧和程序計數器,處于這個狀態的線程并沒有開始運行,它只是表示該線程可以運行了。
從start()源碼中看出,start后添加到了線程列表中,接著在native層添加到VM中,至于該線程何時開始運行,取決于JVM里線程調度器的調度,如果OS調度選中了,就會進入到運行狀態。
運行(Running)
如果處于就緒狀態的線程獲得了CPU資源,就開始執行run方法的線程執行體,則該線程處于運行狀態。run方法在哪里呢?其實run也是在native線程中。
阻塞(Blocked)
線程因為某種原因放棄CPU使用權,暫時停止運行。這個狀態下是不能分配CPU執行的。
可能會發生的幾種情況:
(1)調用了sleep, wait 方法;
(2)進行 IO 阻塞操作,如監聽system.in,但沒有收到鍵盤的輸入;
(3)獲取某個鎖的釋放,而被加入該鎖的阻塞隊列中
終止(Terminated)
Terminated狀態,就意味著這個線程生命的終結,哪些情況下,線程會進入到Terminated狀態呢?
(1)run()方法執行完成,線程正常結束 ;
(2)線程運行過程中出現了意外的錯誤 ;
(3)JVM 異常結束,所有的線程生命周期均被結束;
(4)調用 stop() 方法;
本文系【程序因子】版權作品,未經授權嚴禁轉載,同時也歡關注同名公眾號【程序因子】迎投稿及合作。