線程的生命周期


線程的生命周期

  當線程被創建並啟動以后,它既不是一啟動就進入了執行狀態,也不是一直處於執行狀態,在線程的生命周期中,它要經過新建(New)、就緒(Runnable)、運

行(Running)、阻塞(Blocked)和死亡(Dead)五種狀態。尤其是當線程啟動以后,它不能一直“霸占”着CPU獨自運行,所以CPU需要在多條線程之間切換,於是線程狀態也

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

1. 新建和就緒狀態

  當程序使用new關鍵字創建了一個線程之后,該線程就處於新建狀態,此時它和其他Java對象一樣,僅僅由Java虛擬機為其分配了內存,並初始化了其成員變量

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

  當線程對象調用了start()方法之后,該線程處於就緒狀態,Java虛擬機會為其創建方法調用棧和程序計數器,處於這個狀態的線程並沒有開始運行,它只是表示該

線程可以運行了。至於該線程何時開始運行,取決於JVM里線程調度器的調度。

2. 運行和阻塞狀態

  如果處於就緒狀態的線程獲得了CPU,開始執行run方法的線程執行體,則該線程處於運行狀態。

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

  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()方法來結束該線程——該方法容易導致死鎖,通常不推薦使用。


免責聲明!

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



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