2020久久超碰欧美精品最新亚洲欧美日韩久久精品,国产福利电影一区二区三区,亚洲欧美日韩一区在线观看,亚洲国产欧美日韩欧美特级,亚洲欧美日韩成人一区久久,欧美日韩精品一区二区三区不卡,国产欧美日韩va另类影音先锋,亚洲欧美日韩久久精品,亚洲欧美日韩国产成人精品影院,亚洲国产欧美日韩精品一区二区三区,欧美日韩国产成人高清视频,日韩久久精品国产免费观看频道,久久人人爽人人爽从片av高清,国产精品综合一区二区

首頁常見問題正文

Java多線程:線程的生命周期的六種狀態(tài)

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

  Java官方API將線程的整個生命周期分為六個狀態(tài),分別是NEW(新建狀態(tài))、RUNNABLE(可運行狀態(tài))、BLOCKED(阻塞狀態(tài))、WAITING(等待狀態(tài))、TIMED_WAITING(定時等待狀態(tài))和TERMINATED(終止狀態(tài))。線程的不同狀態(tài)表明了線程當前正在進行的活動,在程序中,通過一些操作,可以使線程在不同狀態(tài)之間轉(zhuǎn)換,如圖1所示。

  

1615964642254_線程狀態(tài)轉(zhuǎn)換圖.png

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

  圖1中展示了線程各種狀態(tài)的轉(zhuǎn)換關(guān)系,箭頭方向表示可轉(zhuǎn)換的方向。接下來,針對線程生命周期中的六種狀態(tài)分別進行詳細講解,具體如下:

  1.NEW(新建狀態(tài))

  創(chuàng)建一個線程對象后,該線程對象就處于新建狀態(tài),此時它不能運行,和其他Java對象一樣,僅僅由JVM為其分配了內(nèi)存,沒有表現(xiàn)出任何線程的動態(tài)特征。

  2.RUNNABLE(可運行狀態(tài))

  當新建狀態(tài)下的線程對象調(diào)用了start()方法,此時就會從新建狀態(tài)進入可運行狀態(tài)。從圖10-10可以看出,在RUNNABLE狀態(tài)內(nèi)部又可細分成兩種狀態(tài):READY(就緒狀態(tài))和RUNNING(運行狀態(tài)),并且線程可以在這兩個狀態(tài)之間相互轉(zhuǎn)換。

  ● 就緒狀態(tài):線程對象調(diào)用start()方法之后,等待JVM的調(diào)度,此時線程并沒有運行;

  ● 運行狀態(tài):線程對象獲得JVM調(diào)度,如果存在多個CPU,那么允許多個線程并行運行。

     3.BLOCKED(阻塞狀態(tài))

  處于運行狀態(tài)的線程可能會因為某些原因失去CPU的執(zhí)行權(quán),暫時停止運行進入阻塞狀態(tài)。此時,JVM不會給線程分配CPU,直到線程重新進入就緒狀態(tài),才有機會轉(zhuǎn)換到運行狀態(tài)。阻塞狀態(tài)的線程只能先進入就緒狀態(tài),不能直接進入運行狀態(tài)。

  線程一般會在以下兩種情況下進入阻塞狀態(tài):

  ● 當線程A運行過程中,試圖獲取同步鎖時,卻被線程B獲取,此時JVM把當前線程A存到對象的鎖池中,線程A就會進入阻塞狀態(tài);

  ● 當線程運行過程中,發(fā)出IO請求時,此時該線程也會進入阻塞狀態(tài)。

  4.WAITING(等待狀態(tài))

  當處于運行狀態(tài)的線程調(diào)用了無時間參數(shù)限制的方法后,如wait()、join()等方法,就會將當前運行中的線程轉(zhuǎn)換為等待狀態(tài)。

  處于等待狀態(tài)中的線程不能立即爭奪CPU使用權(quán),必須等待其他線程執(zhí)行特定的操作后,才有機會再次爭奪CPU使用權(quán),將等待狀態(tài)的線程轉(zhuǎn)換為運行狀態(tài)。例如,調(diào)用wait()方法而處于等待狀態(tài)中的線程,必須等待其他線程調(diào)用notify()或者notifyAll()方法喚醒當前等待中的線程;調(diào)用join()方法而處于等待狀態(tài)中的線程,必須等待其他加入的線程終止。

  5.TIMED_WAITING(定時等待狀態(tài))

  將運行狀態(tài)中的線程轉(zhuǎn)換為定時等待狀態(tài)中的線程與轉(zhuǎn)換為等待狀態(tài)中的線程操作類似,只是運行線程調(diào)用了有時間參數(shù)限制的方法,如sleep(long millis)、wait(long timeout)、join(long millis)等方法。

  處于定時等待狀態(tài)中的線程也不能立即爭奪CPU使用權(quán),必須等待其他相關(guān)線程執(zhí)行完特定的操作或者限時時間結(jié)束后,才有機會再次爭奪CPU使用權(quán),將定時等待狀態(tài)的線程轉(zhuǎn)換為運行狀態(tài)。例如,調(diào)用了wait(long timeout) 方法而處于等待狀態(tài)中的線程,需要通過其他線程調(diào)用notify()或者notifyAll()方法喚醒當前等待中的線程,或者等待限時時間結(jié)束后也可以進行狀態(tài)轉(zhuǎn)換。

  6.TERMINATED(終止狀態(tài))

  線程的run()方法、call()方法正常執(zhí)行完畢或者線程拋出一個未捕獲的異常(Exception)、錯誤(Error),線程就進入終止狀態(tài)。一旦進入終止狀態(tài),線程將不再擁有運行的資格,也不能再轉(zhuǎn)換到其他狀態(tài),生命周期結(jié)束。

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