查看Thread類的源碼,可以看到其包含一個內部枚舉State, 從而發現線程擁有六個狀態:
(1)New : 新建;
線程剛剛被創建,但是並未被啓動,即未調用start()方法。
(2)Runnable : 可運行;
可以在java虛擬機中運行的狀態,但是它可能在運行自己的代碼,也可能沒有,這取決於操作系統處理器。
(3)Blocked : 被阻塞;
當一個線程試圖獲取一個內部的對象鎖,而該對象鎖被其他的線程持有,則該線程進入被阻塞狀態。
(4)Waitting : 等待;
如果當前線程調用wait()方法,則當前線程進入Time waiting但是這個時候當前線程會釋放所佔有的JVM資源,進入這個狀態過後是不能自動喚醒的,必須調用notify()或者notifyAll()方法,線程進入Waiting
(5)Timed_Waitting: 計時等待;
Object.wait、Thread.join、Lock.tryLock和Condition.await等方法有超時參數,還有Thread.sleep方法、LockSupport.parkNanos方法和LockSupport.parkUntil方法,這些方法會導致線程進入計時等待狀態,如果超時或者出現通知,都會切換會可運行狀態
(6)Terminated : 被終止;
因爲run方法正常退出而死亡,或者因爲沒有捕獲的異常終止了run方法而死亡。
簡易狀態轉換圖: