首頁常見問題正文

Java培訓(xùn):線程的狀態(tài)和轉(zhuǎn)換

更新時間:2023-11-07 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  在Java中,要想實現(xiàn)多線程,就必須在主線程中創(chuàng)建新的線程對象。當(dāng)線程對象創(chuàng)建完成時,線程的生命周期也就開始了,當(dāng)run()方法正常執(zhí)行完畢,或者出現(xiàn)未捕獲的異?;蛘咤e誤的時候,線程的生命周期便結(jié)束了。線程的生命周期中包含五種狀態(tài),分別是新建狀態(tài)、就緒狀態(tài)、運行狀態(tài)、阻塞狀態(tài)和死亡狀態(tài),線程的不同狀態(tài)表明了線程當(dāng)前正在進行的活動。在程序中,通過一些操作可以使線程在不同狀態(tài)之間進行轉(zhuǎn)換,如圖6-6所示。

  圖6-6展示了線程各種狀態(tài)的轉(zhuǎn)換關(guān)系,箭頭表示可轉(zhuǎn)換的方向,其中,單箭頭表示狀態(tài)只能單向轉(zhuǎn)換,雙箭頭表示兩種狀態(tài)可以互相轉(zhuǎn)換,下面針對線程的五種狀態(tài)分別進行詳細講解。

1699348624250_線程的狀態(tài)及轉(zhuǎn)換.jpg

  圖6-6 線程狀態(tài)轉(zhuǎn)換圖

  1.新建狀態(tài)

  當(dāng)線程對象創(chuàng)建成功后,線程就處于新建狀態(tài),處于新建狀態(tài)的線程僅僅是在Java虛擬機中分配了內(nèi)容空間,此時還不能運行。

  2.就緒狀態(tài)

  當(dāng)線程對象調(diào)用了start()方法后,就進入了就緒狀態(tài),處于就緒狀態(tài)的線程位于可運行池中,具備運行的條件,能否獲得CPU的執(zhí)行權(quán)需要等待系統(tǒng)調(diào)度。

  3.運行狀態(tài)

  當(dāng)就緒狀態(tài)的線程獲得CPU的執(zhí)行權(quán),并開始執(zhí)行run()方法時,線程處于運行狀態(tài)。一個線程啟動后,它可能不會一直處于運行狀態(tài),當(dāng)運行狀態(tài)的線程使用完系統(tǒng)分配的時間后,系統(tǒng)就會剝奪該線程占用的CPU資源,讓其他線程獲得執(zhí)行的機會。需要注意的是,只有處于就緒狀態(tài)的線程才可能轉(zhuǎn)換到運行狀態(tài)。

  4.阻塞狀態(tài)

  一個正在執(zhí)行的線程在某些特殊情況下,如果被認為掛起或需要執(zhí)行耗時的輸入/輸出操作時,會讓出CPU的執(zhí)行權(quán)進入阻塞狀態(tài)。進入阻塞狀態(tài)的線程不能進入排隊隊列,只有當(dāng)引起阻塞的原因被消除后,線程才可以轉(zhuǎn)入就緒狀態(tài)。

  5.死亡狀態(tài)

  線程調(diào)用stop()方法時或run()方法執(zhí)行結(jié)束后,即處于死亡狀態(tài)。處于死亡狀態(tài)的線程不具有繼續(xù)運行的能力,也不能轉(zhuǎn)換到其他狀態(tài)。

  本文版權(quán)歸黑馬程序員Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!

  作者:黑馬程序員Java培訓(xùn)學(xué)院

  首發(fā):https://java.itheima.com

分享到:
在線咨詢 我要報名
和我們在線交談!