Java多執行緒之狀態與生命週期
阿新 • • 發佈:2019-01-26
執行緒的生命週期
執行緒建立並啟動後,不是一啟動就進入執行狀態,也不會一直處於執行狀態。
執行緒啟動後不可能一直霸佔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異常