Java 多線程生命週期

多線程生命週期

1、五個階段

線程的生命週期包含5個階段,包括:新建、就緒、運行、阻塞、銷燬。其之間的轉換關係如下圖
在這裏插入圖片描述

1.1 新建

當程序使用new關鍵字創建了一個線程之後,該線程就處於新建狀態,此時它和其他的Java對象一樣,僅僅由Java虛擬機爲其分配內存,並初始化其成員變量的值。此時的線程對象沒有表現出任何線程的動態特徵,程序也不會執行線程的線程執行體。

此階段可以發生的狀態變化:
(1)調用線程的start()方法後,可以進入就緒狀態

注意:
(1)啓動線程使用start()方法,而不是run()方法。不要調用線程對象的run()方法。調用start0方法來啓動線程,系統會把該run()方法當成線程執行體來處理
(2)直按調用線程對象的run()方法,則run()方法立即就會被執行,而且在run()方法返回之前其他線程無法併發執行。也就是說,系統把線程對象當成一個普通對象,而run()方法也是一個普通方法,而不是線程執行體

1.2 就緒

就是調用的線程的start()方法後,JVM 進程會去創建一個新的線程,這時候線程處於等待CPU分配資源階段,誰先搶的CPU資源,誰開始執行。

1.3 運行

CPU調度發生,並從任務隊列中選中了某個就緒線程時,該線程會進入Running執行狀態,並且開始調用run()方法中邏輯代碼

此階段可以發生的狀態變化:
(1)被轉換成死亡狀態,比如調用 stop() 方法;

(2)被轉換成阻塞狀態,比如調用了sleep, wait 方法被加入 waitSet 中;

(3)被轉換成阻塞狀態,如進行 IO 阻塞操作,如查詢數據庫進入阻塞狀態;

(4)被轉換成阻塞狀態,比如獲取某個鎖的釋放,而被加入該鎖的阻塞隊列中;

(5)該線程的時間片用完,CPU 再次調度,進入就緒狀態;

(6)線程主動調用 yield 方法,讓出 CPU 資源,進入就緒狀態

1.4 阻塞

當發生如下情況時,線程將會進入阻塞狀態

(1) 線程調用sleep()方法主動放棄所佔用的處理器資源

(2)線程調用了一個阻塞式IO方法,在該方法返回之前,該線程被阻塞

(3) 線程試圖獲得一個同步監視器,但該同步監視器正被其他線程所持有。關於同步監視器的知識、後面將存更深入的介紹

(4)線程在等待某個通知(notify)

1.5 死亡

線程會以如下3種方式結束,結束後就處於死亡狀態:

(1) run()或call()方法執行完成,線程正常結束。

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

(3)直接調用該線程stop()方法來結束該線程——該方法容易導致死鎖,通常不推薦使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章