執行緒的五種狀態
執行緒在它的生命週期中會處於各種不同的狀態:
-
新建狀態(New)
用new語句建立的執行緒物件處於新建狀態, 此時它和其他Java物件一樣;僅在堆區中被分配了記憶體; -
就緒狀態(Runnable)
當一個執行緒物件建立後,其他執行緒呼叫它的start()方法,該執行緒就處於就緒狀態,處於就緒狀態的執行緒位於可執行池中,等待獲取CPU的使用權。 -
執行狀態(Running)
處於這個狀態的執行緒佔用CPU,執行程式程式碼。在併發環境下,如果只有一個CPU,那麼在任何時刻只有一個執行緒處於執行狀態;只有處於就緒狀態的執行緒才能有機會轉到執行狀態。 -
阻塞狀態(Blocked)
是指因為某些原因放棄爭奪CPU的使用權,暫時停止執行。當執行緒處於阻塞狀態,java虛擬機器不會給執行緒分配CPU,直到執行緒重新進入就緒狀態,它才有機會轉到執行狀態。
阻塞狀態可分為三種:
1、位於物件等待池中的阻塞狀態(Blocked in objects’ wait pool): 執行狀態時,執行某個物件的wait()方法;
2、位於物件鎖池中的阻塞狀態(Blocked in object’s lock pool): 當執行緒處於執行狀態,試圖獲得某個物件的同步鎖時,如該物件的同步鎖已經被其他執行緒佔用,Java虛擬機器就會把這個執行緒放到這個物件的鎖池中;
3、其他阻塞狀態(Otherwise Blocked): 當前執行緒執行了sleep()方法,或者呼叫了其他執行緒的join()方法,或者發出了I/O 請求時,就會進入這個狀態。 -
死亡狀態(Dead)
當執行緒退出run()方法時,就進入死亡狀態,該執行緒結束生命週期。執行緒有可能是正常執行完run()方法退出,也有可能是遇到異常而退出。不管該執行緒正常結束還是異常結束,都不會對其他執行緒造成影響。