線程的生命週期及狀態轉換詳解------詳細版

線程的生命週期主要分爲五個狀態: 新建狀態,就緒狀態,運行狀態,阻塞狀態,死亡狀態.

在這裏插入圖片描述
(1)New:創建線程對象後,該線程處於新建狀態,此時它不能運行,和其他Java對象一樣,僅僅有Java虛擬機爲其分配了內存,沒有表現出任何線程的動態特徵;
(2)Runnable:線程對象調用了start()方法後,該線程就進入了就緒狀態(也稱可運行狀態)。處於就緒狀態的線程位於可運行池中,此時它只是具備了運行的條件,能否獲得CPU的使用權開始運行,還需要等待系統的調度;
(3)Runing:處於就緒狀態的線程獲得了CPU使用權,開始執行run()方法中的線程執行體,則線程處於運行狀態。當一個線程啓動後,它不能一直處於運行狀態(除非它的線程執行體足夠短,瞬間結束),當使用完系統分配的時間後,系統就會剝脫該線程佔用的CPU資源,讓其他線程獲得執行的機會。只有處於就緒狀態的線程纔可能轉換到運行狀態。
(4)Blocked:一個正在執行的線程在某些特殊情況下,如執行耗時的輸入/輸出操作時,會放棄CPU的使用權,進入阻塞狀態。線程進入阻塞狀態後,就不能進入排隊隊列。只有當引用阻塞的原因,被消除後,線程纔可以進入就緒狀態。
——當線程試圖獲取某個對象的同步鎖時,如果該鎖被其他線程所持有,則當前線程進入阻塞狀態,如果想從阻塞狀態進入就緒狀態必須得獲取到其他線程所持有的鎖。
——當線程調用了一個阻塞式的IO方法時,該線程就會進入阻塞狀態,如果想進入就緒狀態就必須要等到這個阻塞的IO方法返回。
——當線程調用了某個對象的wait()方法時,也會使線程進入阻塞狀態,notify()方法喚醒。
——調用了Thread的sleep(long millis)。線程睡眠時間到了會自動進入阻塞狀態。
——一個線程調用了另一個線程的join()方法時,當前線程進入阻塞狀態。等新加入的線程運行結束後會結束阻塞狀態,進入就緒狀態。
線程從阻塞狀態只能進入就緒狀態,而不能直接進入運行狀態,即結束阻塞的線程需要重新進入可運行池中,等待系統的調度。
(5)Terminated:線程的run()方法正常執行完畢或者線程拋出一個未捕獲的異常(Exception)、錯誤(Error),線程就進入死亡狀態。一旦進入死亡狀態,線程將不再擁有運行的資格,也不能轉換爲其他狀態。

最後給大家展示一下詳細的圖片介紹
在這裏插入圖片描述

新建狀態:線程對象創建後

就緒狀態:線程對象調用start()方法啓動後

運行狀態:處於就緒狀態的線程獲得cpu的使用權後

阻塞狀態: 當線程調用了某個對象的wait()方法,調用了Thread的sleep()方法,調用另一個線程的join()方法,調用一個阻塞式的IO方法時會使線程進入阻塞狀態

死亡狀態:run()方法中代碼執行完或者線程拋出一個未捕獲的異常或者錯誤

生命週期

Thread對象創建完成時,線程的生命週期就開始了;

run()方法中代碼執行完或者線程拋出一個未捕獲的異常或者錯誤,線程的生命週期就結束了;

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