網上好多帖子把操做系統的線程狀態跟java的線程狀態混爲一談,致使誤導了好多人;java
如今根據java的Thread類來分析java的線程狀態;jvm
public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; }
經過源碼能夠看到,java線程狀態共有6種,分別爲NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED;spa
新建初始狀態,例如new Thread(),而且沒有調用start()方法;操作系統
可運行狀態,此時調用了*start()*方法,java線程中將操做系統中的就緒狀態(ready)和運行中狀態(running)統一歸類爲可運行狀態(RUNNABLE)。 雖然該狀態的線程在jvm中是運行狀態,但可能處於等待操做系統cpu的調度。線程
阻塞狀態,等待監視器鎖(monitor lock),表示線程阻塞於鎖;code
觸發條件:同步
等待狀態,進入該狀態的線程須要等待其它線程進行一些特殊操做,如notify、notifyAll、unpark;源碼
觸發條件:調用下列任何一個方法it
超時等待狀態,該狀態與WAITING不一樣之處是在指定時間後能夠自動喚醒到就緒狀態;class
觸發條件:調用下列任何一個方法
終止狀態,表示該線程已執行完畢。