線程在必定條件下,狀態會發生變化。線程一共有如下幾種狀態:java
(1)、等待阻塞:運行的線程執行wait()方法,該線程會釋放佔用的全部資源,JVM會把該線程放入「等待池」中。進入這個狀態後,是不能自動喚醒的,必須依靠其餘線程調用notify()或notifyAll()方法才能被喚醒,面試
(2)、同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程佔用,則JVM會把該線程放入「鎖池」中。.net
(3)、其餘阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置爲阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程從新轉入就緒狀態。線程
在這裏,在查閱資料的時候發現其實這裏的狀態有兩種說法。另外一種說法是有五種狀態,包含running狀態。參考 Java 線程狀態之 RUNNABLE,其實Runnable其實就包括了running和ready狀態。
附:面試官問:爲何Java 線程沒有Running 狀態cdn
1. 初始狀態 對象
實現Runnable接口和繼承Thread能夠獲得一個線程類,new一個實例出來,線程就進入了初始狀態。 blog
2.1. 就緒狀態 繼承
就緒狀態只是說你資格運行,調度程序沒有挑選到你,你就永遠是就緒狀態。 調用線程的start()方法,此線程進入就緒狀態。 當前線程sleep()方法結束,其餘線程join()結束,等待用戶輸入完畢,某個線程拿到對象鎖,這些線程也將進入就緒狀態。 當前線程時間片用完了,調用當前線程的yield()方法,當前線程進入就緒狀態。 鎖池裏的線程拿到對象鎖後,進入就緒狀態。 接口
2.2. 運行中狀態 資源
線程調度程序從可運行池中選擇一個線程做爲當前線程時線程所處的狀態。這也是線程進入運行狀態的惟一一種方式。
3. 阻塞狀態
阻塞狀態是線程阻塞在進入synchronized關鍵字修飾的方法或代碼塊(獲取鎖)時的狀態。
4. 等待
處於這種狀態的線程不會被分配CPU執行時間,它們要等待被顯式地喚醒,不然會處於無限期等待的狀態。
5. 超時等待
處於這種狀態的線程不會被分配CPU執行時間,不過無須無限期等待被其餘線程顯示地喚醒,在達到必定時間後它們會自動喚醒。
6. 終止狀態
當線程的run()方法完成時,或者主線程的main()方法完成時,咱們就認爲它終止了。這個線程對象也許是活的,可是,它已經不是一個單獨執行的線程。線程一旦終止了,就不能復生。 在一個終止的線程上調用start()方法,會拋出java.lang.IllegalThreadStateException異常。