成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

線程包括哪些狀態,狀態之間是如何變化?

開發 前端
線程的狀態可以參考JDK中的Thread類中的枚舉State,存在六種狀態

1. 線程狀態-六種狀態

線程的狀態可以參考JDK中的Thread類中的枚舉State,存在六種狀態

public enum State {
//尚未啟動的線程的線程狀態
  NEW,

  //可運行線程的線程狀態
  RUNNABLE,

//線程阻塞等待監視器鎖的線程狀態
  BLOCKED,

//等待線程的線程狀態
  WAITING,

//具有指定等待時間的等待線程的線程狀態(有限等待)
  TIMED_WAITING,

 //已終止線程的線程狀態。線程已完成執行
  TERMINATED;
}

六種狀態介紹:

新建(NEW)

  • 當一個線程對象被創建,但還未調用 start 方法時處于新建狀態
  • 此時未與操作系統底層線程關聯

可運行(RUNNABLE):

  • 調用了 start 方法,就會由新建進入可運行
  • 此時與底層線程關聯,由操作系統調度執行

終結(TERMINATED)

  • 線程內代碼已經執行完畢,由可運行進入終結
  • 此時會取消與底層線程關聯

阻塞(BLOCKED)

  • 當獲取鎖失敗后,由可運行進入 Monitor 的阻塞隊列阻塞,此時不占用 cpu 時間
  • 當持鎖線程釋放鎖時,會按照一定規則喚醒阻塞隊列中的阻塞線程,喚醒后的線程進入可運行狀態

等待(WAITING)

  • 當獲取鎖成功后,但由于條件不滿足,調用了 wait() 方法,此時從可運行狀態釋放鎖進入 Monitor 等待集合等待,同樣不占用 cpu 時間
  • 當其它持鎖線程調用 notify() 或 notifyAll() 方法,會按照一定規則喚醒等待集合中的等待線程,恢復為可運行狀態

有時限等待(TIMED_WAITING)

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

其它情況(只需了解)

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

2. 線程狀態-五種狀態

五種狀態的說法來自于操作系統層面的劃分

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

3. wait和sleep方法的不同?

共同點

wait() ,wait(long) 和 sleep(long) 的效果都是讓當前線程暫時放棄 CPU 的使用權,進入阻塞狀態

不同點

1.方法歸屬不同

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

2.鎖特性不同(重點)

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

面試官:線程包括哪些狀態,狀態之間是如何變化的?

候選人:

在JDK中的Thread類中的枚舉State里面定義了6中線程的狀態分別是:新建、可運行、終結、阻塞、等待和有時限等待六種。

關于線程的狀態切換情況比較多。我分別介紹一下:

當一個線程對象被創建,但還未調用 start 方法時處于新建狀態,調用了 start 方法,就會由新建進入可運行狀態。如果線程內代碼已經執行完畢,由可運行進入終結狀態。當然這些是一個線程正常執行情況。

如果線程獲取鎖失敗后,由可運行進入 Monitor 的阻塞隊列阻塞,只有當持鎖線程釋放鎖時,會按照一定規則喚醒阻塞隊列中的阻塞線程,喚醒后的線程進入可運行狀態。

如果線程獲取鎖成功后,但由于條件不滿足,調用了 wait() 方法,此時從可運行狀態釋放鎖等待狀態,當其它持鎖線程調用 notify() 或 notifyAll() 方法,會恢復為可運行狀態。

還有一種情況是調用 sleep(long) 方法也會從可運行狀態進入有時限等待狀態,不需要主動喚醒,超時時間到自然恢復為可運行狀態。


責任編輯:華軒 來源: springboot葵花寶典
相關推薦

2022-03-23 08:51:21

線程池Java面試題

2024-11-28 11:07:50

線程JVM操作系統

2023-12-01 14:57:22

TCP連接

2015-01-06 09:11:54

TCP

2023-10-26 07:15:46

2021-12-26 18:22:30

Java線程多線程

2012-12-26 13:26:38

Android開發飛行模式

2020-10-23 06:58:48

HTTP狀態碼服務器

2017-10-27 07:11:38

TomcatUPDOWN

2022-10-12 14:23:30

Java線程

2021-12-28 09:10:55

Java線程狀態

2023-07-24 16:28:51

@State@Observed裝飾器監聽

2010-05-14 10:37:20

2024-04-22 09:12:39

Redux開源React

2020-10-15 10:38:35

C語言狀態模型

2024-10-11 15:04:35

KafkaLeader選舉

2023-05-08 23:20:49

WebYARN管理

2022-09-19 13:18:13

物聯網設備物聯網

2022-06-01 12:00:54

HTTP狀態碼服務端

2010-01-15 13:30:37

VB.NET并發性
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男女羞羞视频在线 | 一级黄色片在线免费观看 | 视频一区在线 | 综合久久亚洲 | 欧美嘿咻 | 国产 日韩 欧美 在线 | 国产一区二区 | 日韩欧美精品一区 | 国产亚洲网站 | 美日韩视频 | 成人精品视频99在线观看免费 | 日本超碰在线 | 成人在线黄色 | 日韩久久精品 | 久久午夜视频 | 国产亚洲高清视频 | 欧美日韩中| 欧美在线视频一区二区 | av一区二区三区在线观看 | 精品欧美一区二区三区久久久 | 日本又色又爽又黄又高潮 | 免费看国产一级特黄aaaa大片 | 成人在线一区二区三区 | 国产免费观看一级国产 | 欧美日韩在线观看视频网站 | 91精品国产高清一区二区三区 | 久久99国产精品久久99果冻传媒 | 超碰免费观看 | 91视频在线网站 | 一区二区三区福利视频 | 狠狠草视频| 精品国产一区二区三区久久狼黑人 | 黄色av免费 | 麻豆天堂| 91视频进入 | www.免费看片.com| 99免费视频| 欧美日韩国产一区二区 | 成人在线免费观看视频 | 天天色图 | 午夜性色a√在线视频观看9 |