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

Java線程五種狀態(tài)與六種狀態(tài)兩種說法有什么區(qū)別?

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

Java是支持多線程的語言之一,它對多線程編程提供了內(nèi)置的支持,可以使程序同時執(zhí)行多個執(zhí)行片段。線程的6種狀態(tài)和轉(zhuǎn)換如下圖:

線程6種狀態(tài)之間的轉(zhuǎn)換

*新建

 當(dāng)一個線程對象被創(chuàng)建,但還未調(diào)用 start 方法時處于新建狀態(tài)

 此時未與操作系統(tǒng)底層線程關(guān)聯(lián)

*可運(yùn)行

 調(diào)用了 start 方法,就會由新建進(jìn)入可運(yùn)行

 此時與底層線程關(guān)聯(lián),由操作系統(tǒng)調(diào)度執(zhí)行

*終結(jié)

 線程內(nèi)代碼已經(jīng)執(zhí)行完畢,由可運(yùn)行進(jìn)入終結(jié),此時會取消與底層線程關(guān)聯(lián)

*阻塞

 當(dāng)獲取鎖失敗后,由可運(yùn)行進(jìn)入 Monitor 的阻塞隊(duì)列阻塞,此時不占用 cpu 時間

 當(dāng)持鎖線程釋放鎖時,會按照一定規(guī)則喚醒阻塞隊(duì)列中的阻塞線程,喚醒后的線程進(jìn)入可運(yùn)行狀態(tài)

*等待

 當(dāng)獲取鎖成功后,但由于條件不滿足,調(diào)用了 wait() 方法,此時從可運(yùn)行狀態(tài)釋放鎖進(jìn)入 Monitor 等待集合等待,同樣不占用 cpu 時間

當(dāng)其它持鎖線程調(diào)用 notify() 或 notifyAll() 方法,會按照一定規(guī)則喚醒等待集合中的等待線程,恢復(fù)為**可運(yùn)行狀態(tài)

*有時限等待

 當(dāng)獲取鎖成功后,但由于條件不滿足,調(diào)用了 wait(long) 方法,此時從可運(yùn)行狀態(tài)釋放鎖進(jìn)入 Monitor 等待集合進(jìn)行有時限等待,同樣不占用 cpu 時間。

 當(dāng)其它持鎖線程調(diào)用 notify() 或 notifyAll() 方法,會按照一定規(guī)則喚醒等待集合中的**有時限等待**線程,恢復(fù)為可運(yùn)行狀態(tài),并重新去競爭鎖。

 如果等待超時,也會從有時限等待狀態(tài)恢復(fù)為可運(yùn)行狀態(tài),并重新去競爭鎖。

 還有一種情況是調(diào)用 sleep(long) 方法也會從可運(yùn)行狀態(tài)進(jìn)入有時限等待狀態(tài),但與 Monitor 無關(guān),不需要主動喚醒,超時時間到自然恢復(fù)為可運(yùn)行狀態(tài)。

可以用 interrupt() 方法打斷等待、有時限等待的線程,讓它們恢復(fù)為可運(yùn)行狀態(tài),park,unpark 等方法也可以讓線程等待和喚醒。

 *五種狀態(tài)

   五種狀態(tài)的說法來自于操作系統(tǒng)層面的劃分

1655281396869_77.png

運(yùn)行態(tài):分到 cpu 時間,能真正執(zhí)行線程內(nèi)代碼的

就緒態(tài):有資格分到 cpu 時間,但還未輪到它的

阻塞態(tài):沒資格分到 cpu 時間的,涵蓋了 java 狀態(tài)中提到的阻塞、等待、有時限等待.多出了阻塞 I/O,指線程在調(diào)用阻塞 I/O 時,實(shí)際活由 I/O 設(shè)備完成,此時線程無事可做,只能干等

新建與終結(jié)態(tài):與 java 中同名狀態(tài)類似,不再啰嗦





猜你喜歡:

Executor接口實(shí)現(xiàn)線程池管理

電商項(xiàng)目中應(yīng)用多線程的場景有哪些?【Java面試題】

如何保證多線程共享數(shù)據(jù)的安全?

java線程休眠的sleep方法詳細(xì)介紹

黑馬程序員Java后端開發(fā)培訓(xùn)

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