java多線程的幾種狀態


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM