Java線程的生命周期

通用的線程生命周期
通用的線程生命周期基本上可以用下圖這個(gè)“五態(tài)模型”來(lái)描述侍瑟。這五態(tài)分別是:初始狀 態(tài)、可運(yùn)行狀態(tài)莱预、運(yùn)行狀態(tài)柠掂、休眠狀態(tài)和終止?fàn)顟B(tài)

通用線程狀態(tài)轉(zhuǎn)換圖——五態(tài)模型

這“五態(tài)模型”的詳細(xì)情況如下所示依沮。

  1. 初始狀態(tài)涯贞,指的是線程已經(jīng)被創(chuàng)建,但是還不允許分配 CPU 執(zhí)行危喉。這個(gè)狀態(tài)屬于編程語(yǔ) 言特有的宋渔,不過(guò)這里所謂的被創(chuàng)建,僅僅是在編程語(yǔ)言層面被創(chuàng)建辜限,而在操作系統(tǒng)層 面皇拣,真正的線程還沒(méi)有創(chuàng)建。
  2. 可運(yùn)行狀態(tài)列粪,指的是線程可以分配 CPU 執(zhí)行审磁。在這種狀態(tài)下,真正的操作系統(tǒng)線程已經(jīng) 被成功創(chuàng)建了岂座,所以可以分配 CPU 執(zhí)行态蒂。
  3. 當(dāng)有空閑的 CPU 時(shí),操作系統(tǒng)會(huì)將其分配給一個(gè)處于可運(yùn)行狀態(tài)的線程费什,被分配到 CPU 的線程的狀態(tài)就轉(zhuǎn)換成了運(yùn)行狀態(tài)钾恢。
  4. 運(yùn)行狀態(tài)的線程如果調(diào)用一個(gè)阻塞的 API(例如以阻塞方式讀文件)或者等待某個(gè)事件 (例如條件變量),那么線程的狀態(tài)就會(huì)轉(zhuǎn)換到休眠狀態(tài)鸳址,同時(shí)釋放 CPU 使用權(quán)瘩蚪,休眠 狀態(tài)的線程永遠(yuǎn)沒(méi)有機(jī)會(huì)獲得 CPU 使用權(quán)。當(dāng)?shù)却氖录霈F(xiàn)了稿黍,線程就會(huì)從休眠狀態(tài) 轉(zhuǎn)換到可運(yùn)行狀態(tài)疹瘦。
  5. 線程執(zhí)行完或者出現(xiàn)異常就會(huì)進(jìn)入終止?fàn)顟B(tài),終止?fàn)顟B(tài)的線程不會(huì)切換到其他任何狀 態(tài)巡球,進(jìn)入終止?fàn)顟B(tài)也就意味著線程的生命周期結(jié)束了言沐。
    這五種狀態(tài)在不同編程語(yǔ)言里會(huì)有簡(jiǎn)化合并。例如酣栈,C 語(yǔ)言的 POSIX Threads 規(guī)范险胰,就把 初始狀態(tài)和可運(yùn)行狀態(tài)合并了;Java 語(yǔ)言里則把可運(yùn)行狀態(tài)和運(yùn)行狀態(tài)合并了,這兩個(gè)狀 態(tài)在操作系統(tǒng)調(diào)度層面有用矿筝,而 JVM 層面不關(guān)心這兩個(gè)狀態(tài)起便,因?yàn)?JVM 把線程調(diào)度交給 操作系統(tǒng)處理了。
    除了簡(jiǎn)化合并,這五種狀態(tài)也有可能被細(xì)化榆综。

Java 中線程的生命周期

Java 語(yǔ)言中線程共有六種狀態(tài)妙痹,分別是:

  1. NEW(初始化狀態(tài))
  2. RUNNABLE(可運(yùn)行 / 運(yùn)行狀態(tài))
  3. BLOCKED(阻塞狀態(tài))
  4. WAITING(無(wú)時(shí)限等待)
  5. TIMED_WAITING(有時(shí)限等待)
  6. TERMINATED(終止?fàn)顟B(tài))
    這看上去挺復(fù)雜的,狀態(tài)類(lèi)型也比較多奖年。但其實(shí)在操作系統(tǒng)層面细诸,Java 線程中的 BLOCKED、WAITING陋守、TIMED_WAITING 是一種狀態(tài),即休眠狀態(tài)利赋。也就是說(shuō)只要 Java 線程處于這三種狀態(tài)之一水评,那么這個(gè)線程就永遠(yuǎn)沒(méi)有 CPU 的使用權(quán)。

線程狀態(tài)的切換

1. RUNNABLE 與 BLOCKED 的狀態(tài)轉(zhuǎn)換

只有一種場(chǎng)景會(huì)觸發(fā)這種轉(zhuǎn)換媚送,就是線程等待 synchronized 的隱式鎖中燥。synchronized 修 飾的方法、代碼塊同一時(shí)刻只允許一個(gè)線程執(zhí)行塘偎,其他線程只能等待疗涉,這種情況下,等待的 線程就會(huì)從 RUNNABLE 轉(zhuǎn)換到 BLOCKED 狀態(tài)吟秩。而當(dāng)?shù)却木€程獲得 synchronized 隱 式鎖時(shí)咱扣,就又會(huì)從 BLOCKED 轉(zhuǎn)換到 RUNNABLE 狀態(tài)。而我們平時(shí)所謂的 Java 在調(diào)用阻塞式 API 時(shí)涵防,線程會(huì)阻塞闹伪,指的是操作系統(tǒng)線程的狀態(tài), 并不是Java 線程的狀態(tài)壮池,Java 線程的狀態(tài)會(huì)依然保持 RUNNABLE 狀態(tài)偏瓤。

2. RUNNABLE 與 WAITING 的狀態(tài)轉(zhuǎn)換 總體來(lái)說(shuō),有三種場(chǎng)景會(huì)觸發(fā)這種轉(zhuǎn)換椰憋。

第一種場(chǎng)景厅克,獲得 synchronized 隱式鎖的線程,調(diào)用無(wú)參數(shù)的 Object.wait() 方法橙依。
第二種場(chǎng)景证舟,調(diào)用無(wú)參數(shù)的 Thread.join() 方法。
第三種場(chǎng)景票编,調(diào)用 LockSupport.park() 方法褪储。其中的 LockSupport 對(duì)象,其實(shí) Java 并發(fā)包中的鎖慧域,都是基于它實(shí)現(xiàn)的鲤竹。調(diào)用 LockSupport.park() 方法,當(dāng)前 線程會(huì)阻塞,線程的狀態(tài)會(huì)從 RUNNABLE 轉(zhuǎn)換到 WAITING辛藻。調(diào)用 LockSupport.unpark(Thread thread) 可喚醒目標(biāo)線程碘橘,目標(biāo)線程的狀態(tài)又會(huì)從 WAITING 狀態(tài)轉(zhuǎn)換到 RUNNABLE。

3. RUNNABLE 與 TIMED_WAITING 的狀態(tài)轉(zhuǎn)換 有五種場(chǎng)景會(huì)觸發(fā)這種轉(zhuǎn)換:
  1. 調(diào)用帶超時(shí)參數(shù)的 Thread.sleep(long millis) 方法;
  2. 獲得 synchronized 隱式鎖的線程吱肌,調(diào)用帶超時(shí)參數(shù)的 Object.wait(long timeout) 方
    法;
  3. 調(diào)用帶超時(shí)參數(shù)的 Thread.join(long millis) 方法;
  4. 調(diào)用帶超時(shí)參數(shù)的 LockSupport.parkNanos(Object blocker, long deadline) 方法;
  5. 調(diào)用帶超時(shí)參數(shù)的 LockSupport.parkUntil(long deadline) 方法痘拆。
    這里你會(huì)發(fā)現(xiàn) TIMED_WAITING 和 WAITING 狀態(tài)的區(qū)別,僅僅是觸發(fā)條件多了超時(shí)參 數(shù)氮墨。
4. 從 NEW 到 RUNNABLE 狀態(tài)

Java 剛創(chuàng)建出來(lái)的 Thread 對(duì)象就是 NEW 狀態(tài)纺蛆,而創(chuàng)建 Thread 對(duì)象主要有兩種方法。 一種是繼承 Thread 對(duì)象规揪,重寫(xiě) run() 方法桥氏。

  1. 從 RUNNABLE 到 TERMINATED 狀態(tài)
    線程執(zhí)行完 run() 方法后,會(huì)自動(dòng)轉(zhuǎn)換到 TERMINATED 狀態(tài)猛铅。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末字支,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奸忽,更是在濱河造成了極大的恐慌堕伪,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栗菜,死亡現(xiàn)場(chǎng)離奇詭異欠雌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)苛萎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)桨昙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人腌歉,你說(shuō)我怎么就攤上這事蛙酪。” “怎么了翘盖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵桂塞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我馍驯,道長(zhǎng)阁危,這世上最難降的妖魔是什么汰瘫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮混弥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己晾捏,他們只是感情好蒿涎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著劳秋,像睡著了一般胖齐。 火紅的嫁衣襯著肌膚如雪玻淑。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,850評(píng)論 1 290
  • 那天呀伙,我揣著相機(jī)與錄音岁忘,去河邊找鬼。 笑死区匠,一個(gè)胖子當(dāng)著我的面吹牛帅腌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戚篙,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼溺职,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了浪耘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤痛倚,失蹤者是張志新(化名)和其女友劉穎澜躺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體掘鄙,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年收津,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛹稍。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡部服,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出廓八,到底是詐尸還是另有隱情,我是刑警寧澤剧蹂,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布宠叼,位于F島的核電站,受9級(jí)特大地震影響冒冬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜简烤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挥萌。 院中可真熱鬧枉侧,春花似錦、人聲如沸棵逊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛙讥。三九已至锯蛀,卻和暖如春次慢,著一層夾襖步出監(jiān)牢的瞬間翔曲,已是汗流浹背劈愚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掠械,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓猾蒂,卻偏偏與公主長(zhǎng)得像是晨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罩缴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 摘要 在線程被創(chuàng)建并啟動(dòng)以后箫章,并不是立馬就進(jìn)入了執(zhí)行狀態(tài),也不是一直處于執(zhí)行狀態(tài)之中炉抒。因?yàn)镃PU需要在不同的線程之...
    胖瘦饅頭閱讀 264評(píng)論 0 0
  • 文/粒粒 冬天節(jié)日多稚叹,從深秋末的萬(wàn)圣節(jié)算起,感恩節(jié)塞茅,圣誕節(jié),一不留神野瘦,新的一年開(kāi)始了飒泻。最近小妞放假在家,應(yīng)相當(dāng)于我...
    粒粒西游記閱讀 1,151評(píng)論 4 2
  • 人的一生彤灶,都不愿意有后悔和遺憾,可誰(shuí)人的一生史辙,沒(méi)有后悔和遺憾佩伤?人們都希望不要做錯(cuò)事,可有些錯(cuò)眼下發(fā)生了生巡,其實(shí)...
    a591180c0575閱讀 262評(píng)論 1 1
  • 一日之計(jì)在于晨见妒。 當(dāng)我寫(xiě)下上句話時(shí),太陽(yáng)還在東半球徐鹤; 而當(dāng)我寫(xiě)下上句話時(shí),天都黑了返敬。 時(shí)間真快啊……無(wú)力也沒(méi)有責(zé)任...
    Gaxgion閱讀 142評(píng)論 0 1
  • 程彥暄春運(yùn)臨近凛澎,能否搶到回家的車(chē)票成為很多人的心頭病。近幾年塑煎,網(wǎng)上搶票已經(jīng)成為許多人買(mǎi)票的首選。網(wǎng)絡(luò)搶票軟件也滋生...
    程彥暄閱讀 159評(píng)論 0 0