- Offer來了:Java面試核心知識點精講(原理篇)
- 王磊
- 1138字
- 2020-04-03 12:50:12
3.4 線程的生命周期
線程的生命周期分為新建(New)、就緒(Runnable)、運行(Running)、阻塞(Blocked)和死亡(Dead)這5種狀態。在系統運行過程中不斷有新的線程被創建,舊的線程在執行完畢后被清理,線程在排隊獲取共享資源或者鎖時將被阻塞,因此運行中的線程會在就緒、阻塞、運行狀態之間來回切換。線程的具體狀態轉化流程如圖3-4所示。

圖3-4
其流程如下所述。
(1)調用new方法新建一個線程,這時線程處于新建狀態。
(2)調用start方法啟動一個線程,這時線程處于就緒狀態。
(3)處于就緒狀態的線程等待線程獲取CPU資源,在等待其獲取CPU資源后線程會執行run方法進入運行狀態。
(4)正在運行的線程在調用了yield方法或失去處理器資源時,會再次進入就緒狀態。
(5)正在執行的線程在執行了sleep方法、I/O阻塞、等待同步鎖、等待通知、調用suspend方法等操作后,會掛起并進入阻塞狀態,進入Blocked池。
(6)阻塞狀態的線程由于出現sleep時間已到、I/O方法返回、獲得同步鎖、收到通知、調用resume方法等情況,會再次進入就緒狀態,等待CPU時間片的輪詢。該線程在獲取CPU資源后,會再次進入運行狀態。
(7)處于運行狀態的線程,在調用run方法或call方法正常執行完成、調用stop方法停止線程或者程序執行錯誤導致異常退出時,會進入死亡狀態。
3.4.1 新建狀態:New
在Java中使用new關鍵字創建一個線程,新創建的線程將處于新建狀態。在創建線程時主要是為線程分配內存并初始化其成員變量的值。
3.4.2 就緒狀態:Runnable
新建的線程對象在調用start方法之后將轉為就緒狀態。此時JVM完成了方法調用棧和程序計數器的創建,等待該線程的調度和運行。
3.4.3 運行狀態:Running
就緒狀態的線程在競爭到CPU的使用權并開始執行run方法的線程執行體時,會轉為運行狀態,處于運行狀態的線程的主要任務就是執行run方法中的邏輯代碼。
3.4.4 阻塞狀態: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處理完畢,線程才重新轉為可運行狀態。
3.4.5 線程死亡:Dead
線程在以下面三種方式結束后轉為死亡狀態。
◎ 線程正常結束:run方法或call方法執行完成。
◎ 線程異常退出:運行中的線程拋出一個Error或未捕獲的Exception,線程異常退出。
◎ 手動結束:調用線程對象的stop方法手動結束運行中的線程(該方式會瞬間釋放線程占用的同步對象鎖,導致鎖混亂和死鎖,不推薦使用)。
- UML和模式應用(原書第3版)
- JavaScript+DHTML語法與范例詳解詞典
- Easy Web Development with WaveMaker
- Learning Raspbian
- BIM概論及Revit精講
- Mastering JavaScript Design Patterns(Second Edition)
- OpenGL Data Visualization Cookbook
- 21天學通C++(第5版)
- INSTANT Silverlight 5 Animation
- 現代C:概念剖析和編程實踐
- Arduino機器人系統設計及開發
- Mastering Unreal Engine 4.X
- Test-Driven iOS Development with Swift
- iOS Development with Xamarin Cookbook
- 高性能MVVM框架的設計與實現:San