日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

線程包括哪些狀態(tài),狀態(tài)之間是如何變化?

來源: 責(zé)編: 時(shí)間:2023-11-30 09:28:45 243觀看
導(dǎo)讀1. 線程狀態(tài)-六種狀態(tài)線程的狀態(tài)可以參考JDK中的Thread類中的枚舉State,存在六種狀態(tài)public enum State {//尚未啟動(dòng)的線程的線程狀態(tài) NEW, //可運(yùn)行線程的線程狀態(tài) RUNNABLE,//線程阻塞等待監(jiān)視器鎖的線程狀態(tài) B

1. 線程狀態(tài)-六種狀態(tài)

線程的狀態(tài)可以參考JDK中的Thread類中的枚舉State,存在六種狀態(tài)IVG28資訊網(wǎng)——每日最新資訊28at.com

public enum State {//尚未啟動(dòng)的線程的線程狀態(tài)  NEW,  //可運(yùn)行線程的線程狀態(tài)  RUNNABLE,//線程阻塞等待監(jiān)視器鎖的線程狀態(tài)  BLOCKED,//等待線程的線程狀態(tài)  WAITING,//具有指定等待時(shí)間的等待線程的線程狀態(tài)(有限等待)  TIMED_WAITING, //已終止線程的線程狀態(tài)。線程已完成執(zhí)行  TERMINATED;}

IVG28資訊網(wǎng)——每日最新資訊28at.com

六種狀態(tài)介紹:

IVG28資訊網(wǎng)——每日最新資訊28at.com

新建(NEW)

  • 當(dāng)一個(gè)線程對象被創(chuàng)建,但還未調(diào)用 start 方法時(shí)處于新建狀態(tài)
  • 此時(shí)未與操作系統(tǒng)底層線程關(guān)聯(lián)

可運(yùn)行(RUNNABLE):

  • 調(diào)用了 start 方法,就會(huì)由新建進(jìn)入可運(yùn)行
  • 此時(shí)與底層線程關(guān)聯(lián),由操作系統(tǒng)調(diào)度執(zhí)行

終結(jié)(TERMINATED)

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

阻塞(BLOCKED)

  • 當(dāng)獲取鎖失敗后,由可運(yùn)行進(jìn)入 Monitor 的阻塞隊(duì)列阻塞,此時(shí)不占用 cpu 時(shí)間
  • 當(dāng)持鎖線程釋放鎖時(shí),會(huì)按照一定規(guī)則喚醒阻塞隊(duì)列中的阻塞線程,喚醒后的線程進(jìn)入可運(yùn)行狀態(tài)

等待(WAITING)

  • 當(dāng)獲取鎖成功后,但由于條件不滿足,調(diào)用了 wait() 方法,此時(shí)從可運(yùn)行狀態(tài)釋放鎖進(jìn)入 Monitor 等待集合等待,同樣不占用 cpu 時(shí)間
  • 當(dāng)其它持鎖線程調(diào)用 notify() 或 notifyAll() 方法,會(huì)按照一定規(guī)則喚醒等待集合中的等待線程,恢復(fù)為可運(yùn)行狀態(tài)

有時(shí)限等待(TIMED_WAITING)

  • 當(dāng)獲取鎖成功后,但由于條件不滿足,調(diào)用了 wait(long) 方法,此時(shí)從可運(yùn)行狀態(tài)釋放鎖進(jìn)入 Monitor 等待集合進(jìn)行有時(shí)限等待,同樣不占用 cpu 時(shí)間
  • 當(dāng)其它持鎖線程調(diào)用 notify() 或 notifyAll() 方法,會(huì)按照一定規(guī)則喚醒等待集合中的有時(shí)限等待線程,恢復(fù)為可運(yùn)行狀態(tài),并重新去競爭鎖
  • 如果等待超時(shí),也會(huì)從有時(shí)限等待狀態(tài)恢復(fù)為可運(yùn)行狀態(tài),并重新去競爭鎖
  • 還有一種情況是調(diào)用 sleep(long) 方法也會(huì)從可運(yùn)行狀態(tài)進(jìn)入有時(shí)限等待狀態(tài),但與 Monitor 無關(guān),不需要主動(dòng)喚醒,超時(shí)時(shí)間到自然恢復(fù)為可運(yùn)行狀態(tài)

其它情況(只需了解)

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

2. 線程狀態(tài)-五種狀態(tài)

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

IVG28資訊網(wǎng)——每日最新資訊28at.com

  • 運(yùn)行態(tài):分到 cpu 時(shí)間,能真正執(zhí)行線程內(nèi)代碼的
  • 就緒態(tài):有資格分到 cpu 時(shí)間,但還未輪到它的
  • 阻塞態(tài):沒資格分到 cpu 時(shí)間的
  1. 涵蓋了 java 狀態(tài)中提到的阻塞等待有時(shí)限等待
  2. 多出了阻塞 I/O,指線程在調(diào)用阻塞 I/O 時(shí),實(shí)際活由 I/O 設(shè)備完成,此時(shí)線程無事可做,只能干等
  • 新建與終結(jié)態(tài):與 java 中同名狀態(tài)類似,不再啰嗦

3. wait和sleep方法的不同?

共同點(diǎn)

wait() ,wait(long) 和 sleep(long) 的效果都是讓當(dāng)前線程暫時(shí)放棄 CPU 的使用權(quán),進(jìn)入阻塞狀態(tài)IVG28資訊網(wǎng)——每日最新資訊28at.com

不同點(diǎn)

1.方法歸屬不同IVG28資訊網(wǎng)——每日最新資訊28at.com

  • sleep(long) 是 Thread 的靜態(tài)方法
  • 而 wait(),wait(long) 都是 Object 的成員方法,每個(gè)對象都有 醒來時(shí)機(jī)不同
  • 執(zhí)行 sleep(long) 和 wait(long) 的線程都會(huì)在等待相應(yīng)毫秒后醒來
  • wait(long) 和 wait() 還可以被 notify 喚醒,wait() 如果不喚醒就一直等下去
  • 它們都可以被打斷喚醒

2.鎖特性不同(重點(diǎn))IVG28資訊網(wǎng)——每日最新資訊28at.com

  • wait 方法的調(diào)用必須先獲取 wait 對象的鎖,而 sleep 則無此限制
  • wait 方法執(zhí)行后會(huì)釋放對象鎖,允許其它線程獲得該對象鎖(我放棄 cpu,但你們還可以用)
  • 而 sleep 如果在 synchronized 代碼塊中執(zhí)行,并不會(huì)釋放對象鎖(我放棄 cpu,你們也用不了)
3. 線程狀態(tài)面試題

面試官:線程包括哪些狀態(tài),狀態(tài)之間是如何變化的?IVG28資訊網(wǎng)——每日最新資訊28at.com

候選人:

在JDK中的Thread類中的枚舉State里面定義了6中線程的狀態(tài)分別是:新建、可運(yùn)行、終結(jié)、阻塞、等待和有時(shí)限等待六種。IVG28資訊網(wǎng)——每日最新資訊28at.com

關(guān)于線程的狀態(tài)切換情況比較多。我分別介紹一下:IVG28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)一個(gè)線程對象被創(chuàng)建,但還未調(diào)用 start 方法時(shí)處于新建狀態(tài),調(diào)用了 start 方法,就會(huì)由新建進(jìn)入可運(yùn)行狀態(tài)。如果線程內(nèi)代碼已經(jīng)執(zhí)行完畢,由可運(yùn)行進(jìn)入終結(jié)狀態(tài)。當(dāng)然這些是一個(gè)線程正常執(zhí)行情況。IVG28資訊網(wǎng)——每日最新資訊28at.com

如果線程獲取鎖失敗后,由可運(yùn)行進(jìn)入 Monitor 的阻塞隊(duì)列阻塞,只有當(dāng)持鎖線程釋放鎖時(shí),會(huì)按照一定規(guī)則喚醒阻塞隊(duì)列中的阻塞線程,喚醒后的線程進(jìn)入可運(yùn)行狀態(tài)。IVG28資訊網(wǎng)——每日最新資訊28at.com

如果線程獲取鎖成功后,但由于條件不滿足,調(diào)用了 wait() 方法,此時(shí)從可運(yùn)行狀態(tài)釋放鎖等待狀態(tài),當(dāng)其它持鎖線程調(diào)用 notify() 或 notifyAll() 方法,會(huì)恢復(fù)為可運(yùn)行狀態(tài)。IVG28資訊網(wǎng)——每日最新資訊28at.com

還有一種情況是調(diào)用 sleep(long) 方法也會(huì)從可運(yùn)行狀態(tài)進(jìn)入有時(shí)限等待狀態(tài),不需要主動(dòng)喚醒,超時(shí)時(shí)間到自然恢復(fù)為可運(yùn)行狀態(tài)。IVG28資訊網(wǎng)——每日最新資訊28at.com


IVG28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-35299-0.html線程包括哪些狀態(tài),狀態(tài)之間是如何變化?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 說一下線程池的核心參數(shù),線程池的執(zhí)行原理

下一篇: Keras 3.0正式發(fā)布!一統(tǒng)TF/PyTorch/Jax三大后端框架,網(wǎng)友:改變游戲規(guī)則

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 房产| 汝城县| 沧源| 汕尾市| 都安| 互助| 横山县| 钦州市| 松阳县| 屯昌县| 明溪县| 赞皇县| 谷城县| 容城县| 邮箱| 洛南县| 土默特左旗| 斗六市| 马鞍山市| 普宁市| 噶尔县| 历史| 济阳县| 云浮市| 马鞍山市| 交口县| 延寿县| 武安市| 晋城| 曲阳县| 潜江市| 南丰县| 平顺县| 江孜县| 余江县| 商洛市| 甘南县| 文登市| 区。| 达拉特旗| 龙山县|