5個階段:1、新建,是剛使用new方法,new出來的執行緒;2、就緒,是呼叫的執行緒的start()方法後,這時候執行緒處於等待CPU分配資源階段; 3.運行,當就緒的執行緒被調度並獲得CPU資源時,便進入運行狀態;4、阻塞,在運行狀態的時候,可能因為某些原因導致運行狀態的執行緒變成了阻塞狀態;5、銷毀,線程正常執行完畢後或線程被提前強制性的終止或出現異常導致結束,那麼線程就要被銷毀。
本教學操作環境:windows7系統、Dell G3電腦。
執行緒的生命週期包含5個階段,包括:新建、就緒、執行、阻塞、銷毀。完整的生命週期圖如下:
當執行緒進入運作狀態後,一般的作業系統是採用搶佔式的方式來讓執行緒取得CPU。所以CPU需要在多條執行緒之間切換,於是執行緒狀態也會多次在運作、阻塞、就緒之間切換。
新:使用new方法,new出來線程,此時僅由JAVA虛擬機為其分配內存,並初始化成員變數的值。 此時只是個物件。
就緒:就是呼叫的在執行緒的start()方法後,此時執行緒處於等待CPU分配資源階段,誰先搶的CPU資源,誰開始執行;
該執行緒進入就緒狀態,JAVA虛擬機會為其建立方法呼叫棧和程式計數器。執行緒的執行是由底層平台控制, 具有一定的隨機性。
#執行:當就緒的執行緒被調度並且取得CPU資源時,便進入運行狀態,run方法定義了執行緒的操作和功能;(當處於就緒狀態的執行緒獲得CPU,它就會執行run()方法)
對於一個單核心cpu(或者是一個核心)來說,只能同時執行一條指令,而JVM透過快速切換執行緒執行指令來達到多執行緒的,真正處理器就能同時處理一條指令,只是這種切換速度很快,我們根本不會感知到。為了執行緒切換後能恢復到正確的執行位置,每個執行緒都有一個獨立的程式計數器,各條執行緒之間計數器互不影響,獨立儲存。
當一個執行緒開始運作後,它不可能一直持有CPU(除非該執行緒執行體非常短,瞬間就執行結束了)。所以,執行緒在執行過程中需要被中斷,目的是讓它執行緒獲得執行的CPU的機會。執行緒的調度細節取決於底層平台所採用的策略。
阻斷:在運作狀態的時候,可能因為某些原因導致運行狀態的執行緒變成了阻塞狀態。原因如下:
1.等待I/O流的输入输出 2.等待网络资源,即网速问题 3.调用sleep()方法,需要等sleep时间结束 4.调用wait()方法,需要调用notify()唤醒线程 5.其他线程执行join()方法,当前线程则会阻塞,需要等其他线程执行完。
狀態切換圖如下:
如果執行緒正常執行完畢後或執行緒被提前強制性的終止或出現異常導致結束,那麼執行緒就要被銷毀,釋放資源。
1、run()/call()方法執行完成,執行緒正常結束;
2、執行緒拋出一個未捕獲的Exception或Error;
3、直接呼叫執行緒的stop( )方法結束該線程-此方法容易導致死鎖,通常不建議使用。
擴充知識:CPU時間片
作業系統層面有個晶振,有點像和尚在不停的撞鐘,每隔很短很短的一段時間撞一次,將CPU的時間拆成一個一個的時間片;各個線程其實是不停的去搶一個個的時間片;時間片到點後,還是要重新搶(保證所有的執行緒都有機會搶到CPU去執行自己的邏輯;公平性)
新建狀態
我們來看下面一段程式碼:
Thread t1 = new Thread();
這裡的創建,只是在JAVA的這種程式語言層面被創建,而在作業系統層面,真正的線程還沒有被創建。只有當我們呼叫了 start() 方法之後,該執行緒才會被建立出來,進入Runnable狀態。只有當我們呼叫了 start() 方法之後,該執行緒才會被建立出來
更多相關知識,請造訪常見問題欄位!
以上是線程的生命週期分幾個階段的詳細內容。更多資訊請關注PHP中文網其他相關文章!