天天看點

面試必答題“聊聊Java中線程的生命周期狀态”如何破?

👆點選“博文視點Broadview”,擷取更多書訊

面試必答題“聊聊Java中線程的生命周期狀态”如何破?

“聊聊Java中線程的生命周期狀态吧!”

這幾乎是一道面試必答題,這道題怎麼答才是最佳答案呢?本文就帶大家來破解一下!

面試必答題“聊聊Java中線程的生命周期狀态”如何破?

01

一張圖說明線程生命周期

JVM源碼中将線程的生命周期分為建立(New)、可運作(Runnable)、阻塞(Blocked)、等待(Waiting)、逾時等待(Timed_Waiting)和終止(Terminated)這6種狀态。

在系統運作過程中不斷有新的線程被建立,老的線程在執行完畢後被清理,線程在排隊擷取共享資源或者鎖時将被阻塞,是以運作中的線程會在可運作、阻塞、等待狀态之間來回切換。

線程的具體狀态轉化流程如圖所示。

面試必答題“聊聊Java中線程的生命周期狀态”如何破?
面試必答題“聊聊Java中線程的生命周期狀态”如何破?

02

線程生命周期狀态轉化流程

(1)調用new方法建立一個線程,這時線程處于建立狀态。

(2)調用start方法啟動一個線程,這時線程處于可運作狀态。可運作狀态中又分:就緒(Ready)和運作中(Running)兩種狀态。處于就緒狀态的線程等待線程擷取CPU資源,在等待其擷取CPU資源後線程會執行run方法進入運作中狀态;正在運作的線程在調用了yield方法或失去處理器資源時,會再次進入就緒狀态。

(3)正在運作中的線程在執行了sleep方法、I/O阻塞、等待同步鎖、等待通知、調用suspend方法等操作後,會挂起并進入阻塞狀态。阻塞狀态的線程由于出現sleep時間已到、I/O方法傳回、獲得同步鎖、收到通知、調用resume方法等情況,會再次進入可運作狀态中的就緒狀态,等待CPU時間片的輪詢。該線程在擷取CPU資源後,會再次進入運作狀态。

(4)當線程調用了Object.wait ()、Object.join()、LockSupport.park()後線程進入等待狀态。等待狀态的線程調用Object.notify ()、Object. notifyAll()、LockSupport.unpark(Thread)方法後會再次進入可運作狀态。

(5)當可運作狀态的線程調用Thread.sleep(long)、Object.wait(long)、Thread.join(long)、LockSupport.parkNanos()、LockSupport.parkUntil()時線程會進入逾時等待狀态。當逾時等待的線程出現逾時時間到、等待進入synchronized方法、等待進入synchronized塊或者調用Object.notify ()、Object. notifyAll()、LockSupport.unpark(Thread)時會再次進入可運作狀态。

(6)處于可運作狀态的線程,在調用run方法或call方法正常執行完成、調用stop方法停止線程或者程式執行錯誤導緻異常退出時,會進入終止狀态。

面試必答題“聊聊Java中線程的生命周期狀态”如何破?

03

線程生命周期詳解

  • 建立狀态(New)

在Java中使用new關鍵字建立一個線程,新建立的線程将處于建立狀态。在建立線程時主要是為線程配置設定記憶體并初始化其成員變量的值。

  • 就緒狀态:Runnable

建立的線程對象在調用start方法之後将轉為可運作狀态。運作狀态中又分:就緒(Ready)和運作中(Running)兩種狀态。就緒狀态指的是JVM完成了方法調用棧和程式計數器的建立,等待該線程的排程和運作。

就緒狀态的線程在競争到CPU的使用權并開始執行run方法的線程執行體時,會轉為運作中狀态,處于運作中狀态的線程的主要任務就是執行run方法中的邏輯代碼。

  • 阻塞狀态:Blocked

運作中的線程會主動或被動地放棄 CPU 的使用權并暫停運作,此時該線程将轉為阻塞狀态,直到再次進入可運作狀态,才有機會再次競争到CPU使用權并轉為運作狀态。阻塞狀态分為如下三種。

(1)等待阻塞:在運作狀态的線程調用o.wait方法時,JVM會把該線程放入等待隊列(Waitting Queue)中,線程轉為阻塞狀态。

(2)同步阻塞:在運作狀态的線程嘗試擷取正在被其他線程占用的對象同步鎖時,JVM會把該線程放入鎖池(Lock Pool)中,此時線程轉為阻塞狀态。

(3)其他阻塞:運作狀态的線程在執行Thread.sleep(long ms)、Thread.join()或者發出I/O請求時,JVM會把該線程轉為阻塞狀态。直到sleep()狀态逾時、Thread.join()等待線程終止或逾時,或者I/O處理完畢,線程才重新轉為可運作狀态。

  • 等待狀态:Waiting

當線程調用了Object.wait()、Thread.join()、LockSupport.park()會進入等待狀态。處于等待狀态的線程正在等待另一個線程執行指定的操作。例如,調用Object.wait()的一個線程對象正在等待另一個線程調用該對象的Object.notify()或Object.notifyAll()。調用thread .join()的線程正在等待指定的線程退出。

  • 逾時等待狀态:Timed_Waiting

逾時等待和等待狀态的不同是,逾時等待狀态的線程經過逾時時間後會自動喚醒。當線程調用了Thread.sleep ()、Object.wait(long)、Thread.join(long)、LockSupport.parkNanos()、LockSupport.parkUntil()後線程會進入逾時等待狀态。

  • 線程終止:Terminated

線程在以如下三種方式結束後轉為終止狀态。

◎ 線程正常結束:run方法或call方法執行完成。

◎ 線程異常退出:運作中的線程抛出一個Error或未捕獲的Exception,線程異常退出。

◎ 手動結束:調用線程對象的stop方法手動結束運作中的線程(該方式會瞬間釋放線程占用的同步對象鎖,導緻鎖混亂和死鎖,不推薦使用)。

面試必答題“聊聊Java中線程的生命周期狀态”如何破?

本文節選自《Offer來了:Java面試核心知識點精講(第2版)》!

面試必答題“聊聊Java中線程的生命周期狀态”如何破?

王磊 著

  • 超強Java面試寶典
  • 超詳盡Java知識點速查手冊
  • Java面試官的超趁手Java題庫參考書
  • 一書在手,Java我有

本書講解Java面試中常被問及的核心知識點,涉及Java基礎、Java并發程式設計、JVM、Java高并發網絡程式設計、Spring基礎、Netflix的原理及應用、Spring Cloud Alibab的原理及應用、資料結構、Java中常用算法的原理及其Java實作、關系資料庫及分布式事務、分布式緩存的原理及應用、ZooKeeper的原理及應用、Kafka的原理及應用、Elasticsearch的原理及應用、設計模式的概念及其Java實作。

本書内容全面、細緻,既可幫助讀者迅速查找Java知識點,也可幫助讀者完善其Java知識體系;不但可以作為Java面試知識速通手冊,也可以作為Java程式員的案頭手冊。

面試必答題“聊聊Java中線程的生命周期狀态”如何破?

(京東滿100減50,快快掃碼搶購吧!)

面試必答題“聊聊Java中線程的生命周期狀态”如何破?
面試必答題“聊聊Java中線程的生命周期狀态”如何破?
如果喜歡本文歡迎 在看丨留言丨分享至朋友圈 三連
 熱文推薦  
資料安全合規之後,給風控團隊帶來了新的問題
8年打磨,《遊戲設計夢工廠》釋出史詩級更新!
《營運之光3.0》全新上市——跨越時代,自我颠覆的誠意之作!
書單 | 6月重磅新書速遞!           

複制

▼點選閱讀原文,了解本書詳情~