首頁常見問題正文

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

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

IT培訓(xùn)班

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

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

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

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

  1.新建狀態(tài)

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

  2.就緒狀態(tài)

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

  3.運(yùn)行狀態(tài)

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

  4.阻塞狀態(tài)

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

  5.死亡狀態(tài)

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

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

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

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

分享到:
在線咨詢 我要報(bào)名
和我們在線交談!