Java執行緒狀態轉換

↣我愛學習喔發表於2020-11-11

Java語言定義了5種執行緒狀態,在任意一個時間點,一個執行緒只能有且只有其中的一種
狀態,這5種狀態分別如下。
新建(New):建立後尚未啟動的執行緒處於這種狀態。
執行(Runable):Runable包括了作業系統執行緒狀態中的Running和Ready,也就是處於此
狀態的執行緒有可能正在執行,也有可能正在等待著CPU為它分配執行時間。
無限期等待(Waiting):處於這種狀態的執行緒不會被分配CPU執行時間,它們要等待被
其他執行緒顯式地喚醒。以下方法會讓執行緒陷入無限期的等待狀態:
●沒有設定Timeout引數的Object.wait()方法。
●沒有設定Timeout引數的Thread.join()方法。
●LockSupport.park()方法。
限期等待(Timed Waiting):處於這種狀態的執行緒也不會被分配CPU執行時間,不過無
須等待被其他執行緒顯式地喚醒,在一定時間之後它們會由系統自動喚醒。以下方法會讓執行緒
進入限期等待狀態:
●Thread.sleep()方法。
●設定了Timeout引數的Object.wait()方法。
●設定了Timeout引數的Thread.join()方法。
●LockSupport.parkNanos()方法。
●LockSupport.parkUntil()方法。
阻塞(Blocked):執行緒被阻塞了,“阻塞狀態”與“等待狀態”的區別是:“阻塞狀態”在等
待著獲取到一個排他鎖,這個事件將在另外一個執行緒放棄這個鎖的時候發生;而“等待狀
態”則是在等待一段時間,或者喚醒動作的發生。在程式等待進入同步區域的時候,執行緒將
進入這種狀態。
結束(Terminated):已終止執行緒的執行緒狀態,執行緒已經結束執行。

轉換圖:

 

摘自《深入理解java虛擬機器》

相關文章