Java線程的生命周期

摘要

在線程被創(chuàng)建并啟動(dòng)以后粒褒,并不是立馬就進(jìn)入了執(zhí)行狀態(tài)哗蜈,也不是一直處于執(zhí)行狀態(tài)之中茁瘦。因?yàn)镃PU需要在不同的線程之間相互切換纽竣,來達(dá)到一個(gè)較優(yōu)的執(zhí)行效率墓贿,所以線程狀態(tài)也會(huì)在執(zhí)行狀態(tài)與非執(zhí)行狀態(tài)之間來回切換。在線程的生命周期中蜓氨,它分為新建 (New),就緒(Runnable),運(yùn)行(Running),阻塞(Blocked),死亡(Dead)五種狀態(tài)聋袋。

  1. 新建狀態(tài):當(dāng)程序使用new關(guān)鍵字創(chuàng)建一個(gè)線程之后,該線程就處于新建狀態(tài)穴吹,此時(shí)僅由JVM為其分配內(nèi)存幽勒,并初始化其成員變量的值。
  2. 就緒狀態(tài):當(dāng)線程對象調(diào)用了start()方法之后港令,該線程就處于就緒狀態(tài)啥容。JVM會(huì)為其創(chuàng)建方法調(diào)用棧和程序計(jì)數(shù)器,等待調(diào)度運(yùn)行顷霹。
  3. 運(yùn)行狀態(tài):如果就緒狀態(tài)的線程獲得了CPU咪惠,開始執(zhí)行run()方法的線程執(zhí)行體,則該線程處于運(yùn)行狀態(tài)淋淀,
  4. 阻塞狀態(tài):當(dāng)處于運(yùn)行狀態(tài)的線程失去所占用資源之后遥昧,便進(jìn)入阻塞狀態(tài)。
  5. 死亡狀態(tài):線程run(),main()方法執(zhí)行結(jié)束绅喉,或者因異常而退出了run()方法渠鸽,則改線程結(jié)束生命周期。死亡線程不可再次復(fù)生柴罐。

1. 新建和就緒狀態(tài)

當(dāng)程序使用new關(guān)鍵字創(chuàng)建了一個(gè)線程之后徽缚,該線程就處于新建狀態(tài),此時(shí)它和其他的Java對象一樣革屠,僅僅由Java虛擬機(jī)為其分配內(nèi)存凿试,并初始化其成員變量的值。此時(shí)的線程對象沒有表現(xiàn)出任何線程的動(dòng)態(tài)特征似芝,程序也不會(huì)執(zhí)行線程的線程執(zhí)行體那婉。

當(dāng)線程對象調(diào)用了start()方法之后,該線程處于就緒狀態(tài)党瓮。Java虛擬機(jī)會(huì)為其創(chuàng)建方法調(diào)用棧和程序計(jì)數(shù)器详炬,處于這個(gè)狀態(tài)中的線程并沒有開始運(yùn)行,只是表示該線程可以運(yùn)行了寞奸。至于該線程何時(shí)開始運(yùn)行呛谜,取決于JVM里線程調(diào)度器的調(diào)度在跳。

注意:啟動(dòng)線程使用start()方法,而不是run()方法隐岛。永遠(yuǎn)不要調(diào)用線程對象的run()方法猫妙。調(diào)用start0方法來啟動(dòng)線程,系統(tǒng)會(huì)把該run()方法當(dāng)成線程執(zhí)行體來處理聚凹;但如果直按調(diào)用線程對象的run()方法割坠,則run()方法立即就會(huì)被執(zhí)行,而且在run()方法返回之前其他線程無法并發(fā)執(zhí)行妒牙。也就是說彼哼,系統(tǒng)把線程對象當(dāng)成一個(gè)普通對象,而run()方法也是一個(gè)普通方法单旁,而不是線程執(zhí)行體沪羔。需要指出的是饥伊,調(diào)用了線程的run()方法之后象浑,該線程已經(jīng)不再處于新建狀態(tài),不要再次調(diào)用線程對象的start()方法琅豆。只能對處于新建狀態(tài)的線程調(diào)用start()方法愉豺,否則將引發(fā)IllegaIThreadStateExccption異常。

調(diào)用線程對象的start()方法之后茫因,該線程立即進(jìn)入就緒狀態(tài)——就緒狀態(tài)相當(dāng)于"等待執(zhí)行"蚪拦,但該線程并未真正進(jìn)入運(yùn)行狀態(tài)。如果希望調(diào)用子線程的start()方法后子線程立即開始執(zhí)行冻押,程序可以使用Thread.sleep(1) 來讓當(dāng)前運(yùn)行的線程(主線程)睡眠1毫秒驰贷,1毫秒就夠了,因?yàn)樵谶@1毫秒內(nèi)CPU不會(huì)空閑洛巢,它會(huì)去執(zhí)行另一個(gè)處于就緒狀態(tài)的線程括袒,這樣就可以讓子線程立即開始執(zhí)行。

2. 運(yùn)行和阻塞狀態(tài)

2.1 線程調(diào)度

如果處于就緒狀態(tài)的線程獲得了CPU稿茉,開始執(zhí)行run()方法的線程執(zhí)行體锹锰,則該線程處于運(yùn)行狀態(tài),如果計(jì)算機(jī)只有一個(gè)CPU漓库。那么在任何時(shí)刻只有一個(gè)線程處于運(yùn)行狀態(tài)恃慧,當(dāng)然在一個(gè)多處理器的機(jī)器上,將會(huì)有多個(gè)線程并行執(zhí)行渺蒿;當(dāng)線程數(shù)大于處理器數(shù)時(shí)痢士,依然會(huì)存在多個(gè)線程在同一個(gè)CPU上輪換的現(xiàn)象。

當(dāng)一個(gè)線程開始運(yùn)行后茂装,它不可能一直處于運(yùn)行狀態(tài)(除非它的線程執(zhí)行體足夠短怠蹂,瞬間就執(zhí)行結(jié)束了)陪汽。線程在運(yùn)行過程中需要被中斷,目的是使其他線程獲得執(zhí)行的機(jī)會(huì)褥蚯,線程調(diào)度的細(xì)節(jié)取決于底層平臺(tái)所采用的策略挚冤。對于采用搶占式策略的系統(tǒng)而言,系統(tǒng)會(huì)給每個(gè)可執(zhí)行的線程一個(gè)小時(shí)間段來處理任務(wù)赞庶;當(dāng)該時(shí)間段用完后训挡,系統(tǒng)就會(huì)剝奪該線程所占用的資源,讓其他線程獲得執(zhí)行的機(jī)會(huì)歧强。在選擇下一個(gè)線程時(shí)澜薄,系統(tǒng)會(huì)考慮線程的優(yōu)先級(jí)。

所有現(xiàn)代的桌面和服務(wù)器操作系統(tǒng)都采用搶占式調(diào)度策略摊册,但一些小型設(shè)備如手機(jī)則可能采用協(xié)作式調(diào)度策略肤京,在這樣的系統(tǒng)中,只有當(dāng)一個(gè)線程調(diào)用了它的sleep()或yield()方法后才會(huì)放棄所占用的資源——也就是必須由該線程主動(dòng)放棄所占用的資源茅特。

2.2 線程阻塞

當(dāng)發(fā)生如下情況時(shí)忘分,線程將會(huì)進(jìn)入阻塞狀態(tài)

① 線程調(diào)用sleep()方法主動(dòng)放棄所占用的處理器資源

② 線程調(diào)用了一個(gè)阻塞式IO方法,在該方法返回之前白修,該線程被阻塞

③ 線程試圖獲得一個(gè)同步監(jiān)視器妒峦,但該同步監(jiān)視器正被其他線程所持有。關(guān)于同步監(jiān)視器的知識(shí)兵睛、后面將存更深入的介紹

④ 線程在等待某個(gè)通知(notify)

⑤ 程序調(diào)用了線程的suspend()方法將該線程掛起肯骇。但這個(gè)方法容易導(dǎo)致死鎖,所以應(yīng)該盡量避免使用該方法

當(dāng)前正在執(zhí)行的線程被阻塞之后祖很,其他線程就可以獲得執(zhí)行的機(jī)會(huì)笛丙。被阻塞的線程會(huì)在合適的時(shí)候重新進(jìn)入就緒狀態(tài),注意是就緒狀態(tài)而不是運(yùn)行狀態(tài)假颇。也就是說胚鸯,被阻塞線程的阻塞解除后,必須重新等待線程調(diào)度器再次調(diào)度它拆融。

2.3 接觸阻塞

針對上面幾種情況蠢琳,當(dāng)發(fā)生如下特定的情況時(shí)可以解除上面的阻塞,讓該線程重新進(jìn)入就緒狀態(tài):

① 調(diào)用sleep()方法的線程經(jīng)過了指定時(shí)間镜豹。

② 線程調(diào)用的阻塞式IO方法已經(jīng)返回傲须。

③ 線程成功地獲得了試圖取得的同步監(jiān)視器。

④ 線程正在等待某個(gè)通知時(shí)趟脂,其他線程發(fā)出了個(gè)通知泰讽。

⑤ 處于掛起狀態(tài)的線程被調(diào)甩了resdme()恢復(fù)方法。

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

從上圖中可以看出,線程從阻塞狀態(tài)只能進(jìn)入就緒狀態(tài)已卸,無法直接進(jìn)入運(yùn)行狀態(tài)佛玄。而就緒和運(yùn)行狀態(tài)之間的轉(zhuǎn)換通常不受程序控制,而是由系統(tǒng)線程調(diào)度所決定累澡。當(dāng)處于就緒狀態(tài)的線程獲得處理器資源時(shí)梦抢,該線程進(jìn)入運(yùn)行狀態(tài);當(dāng)處于運(yùn)行狀態(tài)的線程失去處理器資源時(shí)愧哟,該線程進(jìn)入就緒狀態(tài)奥吩。但有一個(gè)方法例外,調(diào)用yield()方法可以讓運(yùn)行狀態(tài)的線程轉(zhuǎn)入就緒狀態(tài)蕊梧。關(guān)于yield()方法后面有更詳細(xì)的介紐霞赫。

線程死亡

3.1 死亡狀態(tài)

線程會(huì)以如下3種方式結(jié)束,結(jié)束后就處于死亡狀態(tài):

  1. run()或call()方法執(zhí)行完成肥矢,線程正常結(jié)束端衰。

  2. 線程拋出一個(gè)未捕獲的Exception或Error。

  3. 直接調(diào)用該線程stop()方法來結(jié)束該線程——該方法容易導(dǎo)致死鎖甘改,通常不推薦使用旅东。

3.2 關(guān)于死亡狀態(tài)的代碼判斷

當(dāng)主線程結(jié)束時(shí),其他線程不受任何影響楼誓,并不會(huì)隨之結(jié)束玉锌。一旦子線程啟動(dòng)起來后名挥,它就擁有和主線程相同的地位疟羹,它不會(huì)受主線程的影響。為了測試某個(gè)線程是否已經(jīng)死亡禀倔,可以調(diào)用線程對象的isAlivc()方法榄融,當(dāng)線程處于就緒、運(yùn)行救湖、阻塞了種狀態(tài)時(shí)愧杯,該方法將返回true;當(dāng)線程處于新建鞋既、死亡狀態(tài)時(shí)力九,該方法將返回false。

試圖在線程已死亡的情況下再次調(diào)用start()方法來啟動(dòng)該線程邑闺,將引發(fā)IllegaIThreadStateException異常跌前,這表明處于死亡狀態(tài)的線程無法再次運(yùn)行了。

參考文章:http://www.cnblogs.com/sunddenly/p/4106562.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陡舅,一起剝皮案震驚了整個(gè)濱河市抵乓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖灾炭,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茎芋,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜈出,警方通過查閱死者的電腦和手機(jī)田弥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铡原,“玉大人皱蹦,你說我怎么就攤上這事【祢冢” “怎么了沪哺?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酌儒。 經(jīng)常有香客問我辜妓,道長,這世上最難降的妖魔是什么忌怎? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任籍滴,我火速辦了婚禮,結(jié)果婚禮上榴啸,老公的妹妹穿的比我還像新娘孽惰。我一直安慰自己,他們只是感情好鸥印,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布勋功。 她就那樣靜靜地躺著,像睡著了一般库说。 火紅的嫁衣襯著肌膚如雪狂鞋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天潜的,我揣著相機(jī)與錄音骚揍,去河邊找鬼。 笑死啰挪,一個(gè)胖子當(dāng)著我的面吹牛信不,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亡呵,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼抽活,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了政己?” 一聲冷哼從身側(cè)響起酌壕,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬榮一對情侶失蹤掏愁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后卵牍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體果港,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年糊昙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辛掠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡释牺,死狀恐怖萝衩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情没咙,我是刑警寧澤猩谊,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布,位于F島的核電站祭刚,受9級(jí)特大地震影響牌捷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涡驮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一暗甥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捉捅,春花似錦撤防、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至陌凳,卻和暖如春剥懒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背合敦。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留验游,地道東北人充岛。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像耕蝉,于是被迫代替她去往敵國和親崔梗。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

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