官术网_书友最值得收藏!

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方法手動結束運行中的線程(該方式會瞬間釋放線程占用的同步對象鎖,導致鎖混亂和死鎖,不推薦使用)。

主站蜘蛛池模板: 从化市| 肇州县| 龙门县| 韶关市| 南投市| 固始县| 伊通| 平乐县| 龙江县| 留坝县| 萍乡市| 雅江县| 张家川| 井冈山市| 荣成市| 八宿县| 凉城县| 孟津县| 邹平县| 新泰市| 丹巴县| 隆回县| 六枝特区| 社会| 伊春市| 大冶市| 崇义县| 镇平县| 金溪县| 台北县| 贵定县| 泽库县| 迁安市| 紫金县| 汉寿县| 江阴市| 马公市| 弥渡县| 潜江市| 时尚| 望城县|