全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

首頁(yè)技術(shù)文章正文

Java線(xiàn)程的生命周期及各種狀態(tài)轉(zhuǎn)換詳解

更新時(shí)間:2021-03-17 來(lái)源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif


在Java中,任何對(duì)象都有生命周期,線(xiàn)程也不例外,它也有自己的生命周期。當(dāng)Thread對(duì)象創(chuàng)建完成時(shí),線(xiàn)程的生命周期便開(kāi)始了,當(dāng)線(xiàn)程任務(wù)中代碼正常執(zhí)行完畢或者線(xiàn)程拋出一個(gè)未捕獲的異常(Exception)或者錯(cuò)誤(Error)時(shí),線(xiàn)程的生命周期便會(huì)結(jié)束。

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

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

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

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

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

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

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

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

● 就緒狀態(tài):線(xiàn)程對(duì)象調(diào)用start()方法之后,等待JVM的調(diào)度,此時(shí)線(xiàn)程并沒(méi)有運(yùn)行;

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

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

處于運(yùn)行狀態(tài)的線(xiàn)程可能會(huì)因?yàn)槟承┰蚴PU的執(zhí)行權(quán),暫時(shí)停止運(yùn)行進(jìn)入阻塞狀態(tài)。此時(shí),JVM不會(huì)給線(xiàn)程分配CPU,直到線(xiàn)程重新進(jìn)入就緒狀態(tài),才有機(jī)會(huì)轉(zhuǎn)換到運(yùn)行狀態(tài)。阻塞狀態(tài)的線(xiàn)程只能先進(jìn)入就緒狀態(tài),不能直接進(jìn)入運(yùn)行狀態(tài)。
線(xiàn)程一般會(huì)在以下兩種情況下進(jìn)入阻塞狀態(tài):

● 當(dāng)線(xiàn)程A運(yùn)行過(guò)程中,試圖獲取同步鎖時(shí),卻被線(xiàn)程B獲取,此時(shí)JVM把當(dāng)前線(xiàn)程A存到對(duì)象的鎖池中,線(xiàn)程A就會(huì)進(jìn)入阻塞狀態(tài);

● 當(dāng)線(xiàn)程運(yùn)行過(guò)程中,發(fā)出IO請(qǐng)求時(shí),此時(shí)該線(xiàn)程也會(huì)進(jìn)入阻塞狀態(tài)。

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

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

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

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

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

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

6.TERMINATED(終止?fàn)顟B(tài))

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



猜你喜歡:    
cookie和session的區(qū)別和用法【Java面試題解析】

如何理解Redis?【Java面試】

Java web實(shí)現(xiàn)文件上傳?

java高級(jí)軟件工程師課程

分享到:
在線(xiàn)咨詢(xún) 我要報(bào)名
和我們?cè)诰€(xiàn)交談!