java6種線程狀態

網上好多帖子把操做系統的線程狀態跟java的線程狀態混爲一談,致使誤導了好多人;java

如今根據java的Thread類來分析java的線程狀態;jvm

java.lang.Thread內部枚舉State

public enum State {
        NEW,
		
        RUNNABLE,

        BLOCKED,
   
        WAITING,

        TIMED_WAITING,

        TERMINATED;
    }

經過源碼能夠看到,java線程狀態共有6種,分別爲NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED;spa

狀態分析

NEW

新建初始狀態,例如new Thread(),而且沒有調用start()方法;操作系統

RUNNABLE

可運行狀態,此時調用了*start()*方法,java線程中將操做系統中的就緒狀態(ready)和運行中狀態(running)統一歸類爲可運行狀態(RUNNABLE)。 雖然該狀態的線程在jvm中是運行狀態,但可能處於等待操做系統cpu的調度。線程

BLOCKED

阻塞狀態,等待監視器鎖(monitor lock),表示線程阻塞於鎖;code

觸發條件:同步

  • synchronized同步代碼塊
  • 或synchronized同步方法
WAITING

等待狀態,進入該狀態的線程須要等待其它線程進行一些特殊操做,如notify、notifyAll、unpark;源碼

觸發條件:調用下列任何一個方法it

  • Object#wait()
  • #join()
  • LockSupport#park()
TIMED_WAITING

超時等待狀態,該狀態與WAITING不一樣之處是在指定時間後能夠自動喚醒到就緒狀態;class

觸發條件:調用下列任何一個方法

  • #sleep Thread.sleep
  • Object#wait(long)
  • #join(long)
  • LockSupport#parkNanos
  • LockSupport#parkUntil
TERMINATED

終止狀態,表示該線程已執行完畢。

相關文章
相關標籤/搜索