1. 程式人生 > >java多線程的幾種狀態

java多線程的幾種狀態

ade http for notifyall 其中 參數 lar java多線程 https

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)。

技術分享圖片 技術分享圖片 轉載:https://baijiahao.baidu.com/s?id=1574105592023615&wfr=spider&for=pc

java多線程的幾種狀態