1. 程式人生 > >Java多執行緒之狀態與生命週期

Java多執行緒之狀態與生命週期

執行緒的生命週期

執行緒建立並啟動後,不是一啟動就進入執行狀態,也不會一直處於執行狀態。

執行緒啟動後不可能一直霸佔CPU,所以CPU會在多執行緒之間切換,於是執行緒狀態也會多次在執行、阻塞之間切換

線上程的生命週期中,執行緒共有5種狀態,在任意時刻,執行緒的狀態只能是其中的一種

狀態 說明
New 初始狀態 —>使用new關鍵字,建立一個執行緒,但是還沒有呼叫start方法,僅僅由JVM分配記憶體,並初始化成員變數
Runnable 就緒狀態 —> 呼叫start()後處於就緒狀態,JVM為其建立方法呼叫棧和程式計數器,但執行緒並沒有開始執行,僅表示可以執行。何時開始,取決於JVM裡的執行緒排程器的排程
Running 執行狀態 —>處於就緒狀態的執行緒,獲得了CPU,開始執行run()方法,則處於執行狀態
Blocked 阻塞狀態 —> 表示執行緒阻塞於鎖。執行緒之間需要切換,時間段用完後,系統會剝奪執行緒佔用的資源,讓其他執行緒執行,選擇哪個執行緒,系統會考慮執行緒的優先順序。呼叫sleep(),呼叫阻塞式IO方法,等待同步鎖,等待通知wait(),suspend(),join(),這些將使得執行緒進入阻塞狀態
Waiting 等待狀態 —> 進入該狀態後需要其他執行緒做出通知動作,也可以算是阻塞狀態。需要notify()喚醒執行緒,使之進入就緒狀態
Time_Waiting 超時等狀態狀態 —> 該狀態與WAITING不同,它是可以在指定時間內自行返回的。相當於在等待狀態基礎上,增加了時間的限制,超過了設定的時間限制就會返回到執行狀態
Dead 死亡狀態 —> 執行緒執行完畢。run()或call()執行完成,執行緒丟擲未捕獲的Exception或Error,呼叫該執行緒的stop(),都會結束執行緒。

這裡寫圖片描述
為了測試執行緒是否已經死亡,可以呼叫執行緒物件的isAlive()方法,若處於就緒、執行、阻塞三種狀態,方法返回true;若執行緒處於新建、死亡狀態,方法返回false。

不能對已經死亡的執行緒呼叫start()方法,重新啟動,否則拋IllegalThreadStateException異常