線程的生命週期

線程的生命週期

  當線程被建立並啓動之後,它既不是一啓動就進入了執行狀態,也不是一直處於執行狀態,在線程的生命週期中,它要通過新建(New)、就緒(Runnable)、運線程

行(Running)、阻塞(Blocked)和死亡(Dead)五種狀態。尤爲是當線程啓動之後,它不能一直「霸佔」着CPU獨自運行,因此CPU須要在多條線程之間切換,因而線程狀態也對象

會屢次在運行、阻塞之間切換。blog

1. 新建和就緒狀態

  當程序使用new關鍵字建立了一個線程以後,該線程就處於新建狀態,此時它和其餘Java對象同樣,僅僅由Java虛擬機爲其分配了內存,並初始化了其成員變量生命週期

值。此時的線程對象沒有表現出任何線程的動態特徵,程序也不會執行線程的線程執行體。內存

  當線程對象調用了start()方法以後,該線程處於就緒狀態,Java虛擬機會爲其建立方法調用棧和程序計數器,處於這個狀態的線程並無開始運行,它只是表示該資源

線程能夠運行了。至於該線程什麼時候開始運行,取決於JVM裏線程調度器的調度。同步

2. 運行和阻塞狀態

  若是處於就緒狀態的線程得到了CPU,開始執行run方法的線程執行體,則該線程處於運行狀態。虛擬機

當發生以下狀況下,線程將會進入阻塞狀態:io

  1. 線程調用sleep方法主動放棄所佔用的處理器資源。變量

  2. 線程調用了一個阻塞式IO方法,在該方法返回以前,該線程被阻塞。

  3. 線程試圖得到一個同步監視器,但該同步監視器正被其餘線程鎖持有。關於同步監視器的知識將在後面有更深刻的介紹。

  4. 線程在等待某個通知(notify)。

  5. 程序調用了線程的suspend方法將該線程掛起。不過這個方法容易致使死鎖,因此程序應該儘可能避免使用該方法。

  當前正在執行的線程被阻塞以後,其餘線程就能夠得到執行的機會了。被阻塞的線程會在合適時候從新進入就緒狀態,注意是就緒狀態而不是運行狀態。也就是

說被阻塞線程的阻塞解除後,必須從新等待線程調度器再次調度它。

針對上面的幾種狀況,當發生以下特定的狀況將能夠解除上面的阻塞,讓該線程從新進入就緒狀態:

  1. 調用sleep方法的線程通過了指定時間。

  2. 線程調用的阻塞式IO方法已經返回。

  3. 線程成功地得到了試圖取得同步監視器。

  4. 線程正在等待某個通知時,其餘線程發出了一個通知。

  5. 處於掛起狀態的線程被調用了resume恢復方法。

線程狀態轉換圖:

image

3. 線程死亡

線程會以如下三種方式之一結束,結束後就處於死亡狀態:

  1. run()方法執行完成,線程正常結束。

  2. 線程拋出一個未捕獲的Exception或Error。

  3. 直接調用該線程的stop()方法來結束該線程——該方法容易致使死鎖,一般不推薦使用。

相關文章
相關標籤/搜索