更新時間:2023-11-07 來源:黑馬程序員 瀏覽量:
在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)前正在進(jìn)行的活動。在程序中,通過一些操作可以使線程在不同狀態(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ì)講解。
圖6-6 線程狀態(tài)轉(zhuǎn)換圖
當(dāng)線程對象創(chuàng)建成功后,線程就處于新建狀態(tài),處于新建狀態(tài)的線程僅僅是在Java虛擬機(jī)中分配了內(nèi)容空間,此時還不能運行。
當(dāng)線程對象調(diào)用了start()方法后,就進(jìn)入了就緒狀態(tài),處于就緒狀態(tài)的線程位于可運行池中,具備運行的條件,能否獲得CPU的執(zhí)行權(quán)需要等待系統(tǒng)調(diào)度。
當(dāng)就緒狀態(tài)的線程獲得CPU的執(zhí)行權(quán),并開始執(zhí)行run()方法時,線程處于運行狀態(tài)。一個線程啟動后,它可能不會一直處于運行狀態(tài),當(dāng)運行狀態(tài)的線程使用完系統(tǒng)分配的時間后,系統(tǒng)就會剝奪該線程占用的CPU資源,讓其他線程獲得執(zhí)行的機(jī)會。需要注意的是,只有處于就緒狀態(tài)的線程才可能轉(zhuǎn)換到運行狀態(tài)。
一個正在執(zhí)行的線程在某些特殊情況下,如果被認(rèn)為掛起或需要執(zhí)行耗時的輸入/輸出操作時,會讓出CPU的執(zhí)行權(quán)進(jìn)入阻塞狀態(tài)。進(jìn)入阻塞狀態(tài)的線程不能進(jìn)入排隊隊列,只有當(dāng)引起阻塞的原因被消除后,線程才可以轉(zhuǎn)入就緒狀態(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