java線程狀態在Thread中定義,源碼中能看到有個枚舉State,總共定義了六種狀態:
NEW: 新建狀態,線程對象已經創建,但尚未啟動
RUNNABLE:就緒狀態,可運行狀態,調用了線程的start方法,已經在java虛擬機中執行,等待獲取操作系統資源如CPU,操作系統調度運行。
BLOCKED:堵塞狀態。線程等待鎖的狀態,等待獲取鎖進入同步塊/方法或調用wait后重新進入需要競爭鎖
WAITING:等待狀態。等待另一個線程以執行特定的操作。調用以下方法進入等待狀態。 Object.wait(), Thread.join(),LockSupport.park
TIMED_WAITING: 線程等待一段時間。調用帶參數的Thread.sleep, objct.wait,Thread.join,LockSupport.parkNanos,LockSupport.parkUntil
TERMINATED:進程結束狀態。
狀態之間的轉換狀態圖,總結了下,如下:
其中,Thread.sleep(long)使線程暫停一段時間,進入TIMED_WAITING時間,並不會釋放鎖,在設定時間到或被interrupt后拋出InterruptedException后進入RUNNABLE狀態; Thread.join是等待調用join方法的線程執行一段時間(join(long))或結束后再往后執行,被interrupt后也會拋出異常,join內部也是wait方式實現的。
wait方法是object的方法,線程釋放鎖,進入WAITING或TIMED_WAITING狀態。等待時間到了或被notify/notifyall喚醒后,回去競爭鎖,如果獲得鎖,進入RUNNABLE,否則進步BLOCKED狀態等待獲取鎖。
下面是一個小例子,主線程中調用多線程,等待超時后如果子線程還未結束,則中斷子線程(interrupt)。
