Java 線程:Java線程的生命周期

通用的線程生命周期

  • 五態(tài)模型: 初始狀態(tài)牍颈、可運行狀態(tài)、運行狀態(tài)谍肤、休眠狀態(tài)啦租、終止狀態(tài)
  1. 初始狀態(tài):指的線程已經(jīng)被創(chuàng)建,但是還不允許分配的CPU執(zhí)行荒揣。僅僅只編程語言層面被創(chuàng)建篷角,而在操作系統(tǒng)層面,真正的線程還沒有創(chuàng)建系任。
  2. 可運行狀態(tài): 指的是線程可以分配CPU執(zhí)行恳蹲。此時操作系統(tǒng)線程已經(jīng)被成功創(chuàng)建了,所以可以分配CPU執(zhí)行俩滥。
  3. 當有空間CPU時嘉蕾,操作系統(tǒng)會將其分配給一個處于可運行狀態(tài)的線程。被分配到CPU的線程的狀態(tài)就轉(zhuǎn)換成了運行狀態(tài)霜旧。
  4. 運行狀態(tài)的線程如果調(diào)用一個阻塞API或者等待某個事件错忱,此時線程的狀態(tài)就會轉(zhuǎn)換到了休眠狀態(tài),同時釋放CPU使用權(quán)挂据,休眠狀態(tài)的線程永遠沒有機會獲得CPU使用權(quán)航背。當?shù)却臅r間出現(xiàn)了,線程就會從休眠狀態(tài)轉(zhuǎn)換到可運行狀態(tài)棱貌。
  5. 線程執(zhí)行完或者出現(xiàn)異常就會進入終止狀態(tài)玖媚。就行終止狀態(tài)也就意味著線程的生命周期結(jié)束了

Java中線程的生命周期

  1. NEW(初始化狀態(tài))
  2. RUNNABLE(可運行/運行狀態(tài))
  3. BLOCKED(阻塞狀態(tài))
  4. WAITING(無時限等待)
  5. TERMINATED(終止狀態(tài))

各個狀態(tài)的轉(zhuǎn)換:

  1. RUNNABLE與BLOCKED狀態(tài)轉(zhuǎn)換
  • synchronized
  1. RUNNABLE與WAITING的狀態(tài)轉(zhuǎn)換
  • 有三種場景會觸發(fā)轉(zhuǎn)換:

    1. 獲得synchronized 隱式鎖的線程,調(diào)用了無參數(shù)的Object.wait()方法
    2. 調(diào)用了Thread.join()方法婚脱。其中join()是一種線程同步方法今魔,例如一個線程Thread A,當調(diào)用A.join()的時候障贸,執(zhí)行這條語句的線程會等待thread A執(zhí)行完错森,而等待中的這個線程,其狀態(tài)會從RUNNABLE轉(zhuǎn)換到WAITING.當線程thread A執(zhí)行完篮洁,原來等待它的線程又從WAITING狀態(tài)裝換到RUNNABLE涩维。
    3. LockSupport.park()方法。java并發(fā)包中的鎖,都是基于LockSupport對象實現(xiàn)的瓦阐。調(diào)用LockSupport()方法蜗侈,當前線程會阻塞,線程的狀態(tài)會從RUNNABLE轉(zhuǎn)換到WAITING睡蟋。調(diào)用LockSupport.unpark(Thread thread)可喚醒目標線程踏幻,目標線程的狀態(tài)又從WAITING狀態(tài)轉(zhuǎn)換到RUNNABLE。
  1. RUNNABLE與TIMED_WAITING的狀態(tài)轉(zhuǎn)換
  • 五種場景觸發(fā)這種轉(zhuǎn)換:
    1. 調(diào)用帶超時參數(shù)的Thread.sleep(long millis)方法
    2. 獲得synchronized隱式鎖的線程戳杀,調(diào)用帶超時參數(shù)的Object.wait(long timeout)方法
    3. 調(diào)用帶超時參數(shù)的Thead.join(long millis)方法
    4. 調(diào)用帶超時參數(shù)的LockSupport.parkNanos(Object blocker,long deadline)方法
    5. 調(diào)用帶超時參數(shù)的LockSupport.parkUntil(long deadline)方法该面。
  1. 從NEW到RUNNABLE狀態(tài)
  • 兩種創(chuàng)建線程的方式
  • 當線程被NEW出來以后,調(diào)用start()后才會從NEW轉(zhuǎn)換到RUNNABLE
  1. 從RUNNABLE 到 TERMINATED狀態(tài)
  • 線程執(zhí)行完run()方法后信卡,會自動轉(zhuǎn)換到TERMINATED狀態(tài)隔缀,當如果執(zhí)行run()方法時拋出異常,也會線程終止
  1. stop()和interrupt()方法的主要區(qū)別傍菇?
    1. stop():stop()方法會真的殺死線程蚕泽,不給線程喘息的機會,如果線程持有ReentrantLock鎖桥嗤,被stop()的線程并不會自動調(diào)用ReentrantLock的unlock()去釋放鎖,那其他線程就再也沒有機會獲得ReentrantLock鎖仔蝌,這很危險泛领。所以stop()/suspend()/resume()方法,都不建議使用
    2. interrput():interrupt()方法僅僅是通知線程敛惊,線程有機會執(zhí)行一些后續(xù)的操作渊鞋,同時也可以無視這個通知。被interrupt的線程瞧挤,是怎么收到通知的呢锡宋?一種是異常,另一種是主動檢測特恬。
    • 異常:

      1. 當線程A處于WAITING执俩、TIMED_WAITING狀態(tài)時,如果其他線程調(diào)用線程A的interrupt()方法癌刽,會使線程A返回RUNNABLE狀態(tài)役首,同時線程A的代碼會觸發(fā)InterruptedException異常。WAITING显拜、TIMED_WAITING狀態(tài)的觸發(fā)條件都是調(diào)用了類似wait()衡奥、join()、sleep()這樣的方法远荠,這些方法的簽名矮固,發(fā)現(xiàn)都會throws InterruptedException這個異常。這個異常的觸發(fā)條件就是:其他線程調(diào)用了該線程的interrupt()方法.
      2. 當線程A處于RUNNABLE狀態(tài)譬淳,并且阻塞在java.nio.channels.InterruptibleChannedl上時档址,如果其他線程調(diào)用線程A的interrupt()方法盹兢,線程A會觸發(fā)java.nio.channels.ClosedByInterruptExecption這個異常;而阻塞在java.nio.channels.Selector上時辰晕,如果其他線程調(diào)用A的interrupt()方法蛤迎,線程A的java.nio.channels.Selector會立即返回。
    • 主動檢測:
      如果線程處于RUNNABLE狀態(tài)含友,并且沒有阻塞在某個I/O操作上替裆,,例如中斷就散圓周率的線程A窘问,這時就得依賴A主動檢測人中斷狀態(tài)了辆童。如果其他線程調(diào)用了A的interrupt()方法,那么線程A可以通過isInterrupt()方法惠赫,檢測是不是自己中斷了把鉴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市儿咱,隨后出現(xiàn)的幾起案子庭砍,更是在濱河造成了極大的恐慌,老刑警劉巖混埠,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怠缸,死亡現(xiàn)場離奇詭異,居然都是意外死亡钳宪,警方通過查閱死者的電腦和手機揭北,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吏颖,“玉大人搔体,你說我怎么就攤上這事“胱恚” “怎么了疚俱?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缩多。 經(jīng)常有香客問我计螺,道長,這世上最難降的妖魔是什么瞧壮? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任登馒,我火速辦了婚禮,結(jié)果婚禮上咆槽,老公的妹妹穿的比我還像新娘陈轿。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布麦射。 她就那樣靜靜地躺著蛾娶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪潜秋。 梳的紋絲不亂的頭發(fā)上蛔琅,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音峻呛,去河邊找鬼罗售。 笑死,一個胖子當著我的面吹牛钩述,可吹牛的內(nèi)容都是我干的寨躁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼牙勘,長吁一口氣:“原來是場噩夢啊……” “哼职恳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起方面,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤放钦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恭金,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體操禀,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年蔚叨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辙培。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔑水,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扬蕊,到底是詐尸還是另有隱情搀别,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布尾抑,位于F島的核電站歇父,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏再愈。R本人自食惡果不足惜榜苫,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翎冲。 院中可真熱鬧垂睬,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赏壹,卻和暖如春鱼炒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝌借。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工昔瞧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骨望。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓硬爆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親擎鸠。 傳聞我的和親對象是個殘疾皇子缀磕,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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