Java线程的不同状态
介紹
在Java中,線程可以具有狀態。 Thread.State枚舉定義Java線程可以具有的不同狀態。 該枚舉定義了以下值–
在接下來的部分中,我將簡要概述這些狀態以及它們之間的可能過渡。
Java線程的狀態
新
這是線程首次創建時所獲得的默認狀態。
可運行
線程一開始執行,便立即進入RUNNABLE狀態。 請注意,等待獲取CPU來執行的線程仍處于此狀態。
已封鎖
線程在等待監視器鎖定時被阻塞,便立即進入BLOCKED狀態。 這可以通過以下兩種方式之一進行:
等候
線程由于調用以下方法之一而移至此狀態–
TIMED_WAITING
線程由于調用以下方法之一而移至此狀態–
已終止
線程終止后,它將立即移至該狀態。
可能的狀態轉換
下圖顯示了不同狀態之間可能的轉換–
安排執行線程后,它將立即進入RUNNABLE狀態。 已經用第一個箭頭(標記為1)顯示了此過渡。
從RUNNABLE狀態,線程可以移至BLOCKED,WAITING,TIMED_WAITING或TERMINATED狀態中的任何一個。 從理論上講,如果線程不等待獲取任何鎖,或者不休眠,或者不調用任何使其等待的方法,則它僅完成執行并直接進入TERMINATED狀態(標記為2d)。
當然,在實際應用中,上述情況極不可能發生。 線程通常試圖獲取鎖,在這種情況下,如果線程必須等待鎖,則它會進入BLOCKED(標記為2a)狀態。 線程還顯式地等待某些先決條件為真/來自其他線程的操作,在這種情況下,線程將根據等待是否計時而移至WAITING(標記為2b)或TIMED_WAITING(標記為2c)狀態。
一旦線程移至BLOCKED狀態,接下來唯一允許的過渡就是移至RUNNABLE狀態(標記為3d)。
同樣,從等待狀態的唯一可能轉換是移動到已阻止狀態(標記為3c)。
請注意,Internet上的某些文章錯誤地添加了從WAITING到RUNNABLE狀態的過渡。 這只是不正確的。 線程永遠不能直接從WAITING狀態進入RUNNABLE狀態。 我們可以通過一個例子來了解其原因。
假設我們有一個線程T,該線程當前處于RUNNABLE狀態,并持有三個對象a,b和c的監視器鎖定,如下圖所示–
此時,T調用c.wait(),此后它不再持有對象c的監視器鎖定–
使用調用notify / notifyAll通知T時,它立即停止等待并與其他線程(例如X和Y)競爭以獲取c的監視器鎖定–
根據上面的定義,它是BLOCKED狀態。 僅在獲取了c的監視器鎖定后,T才進入RUNNABLE狀態。 可以對Thread.join()(內部使用Object.wait())和LockSupport.park()應用類似的推理。
讓我們回到原始狀態轉換圖。 如我們所見,線程可以從TIMED_WAITING狀態移動到RUNNABLE(標記為3b)或BLOCKED(標記為3a)狀態。 在這種情況下,可以轉換為RUNNABLE,因為線程可以在調用Thread.sleep方法后進入TIMED_WAITING狀態,在這種情況下,它保留當前持有的所有監視器鎖定。
當線程在RUNNABLE,BLOCKED,WAITING或TIMED_WAITING狀態之間來回移動后,完成執行時,它將一勞永逸地進入TERMINATED狀態。
我們如何獲得線程的當前狀態?
我們可以使用Thread.getState()方法來檢索線程的當前狀態。 我們可以使用此值來監視或調試應用程序在生產中可能遇到的任何并發問題。
結論
在本文中,我們簡要回顧了Java線程可以具有的不同狀態,以及線程如何在這些狀態之間移動。 與往常一樣,任何反饋/改進建議/評論都將受到高度贊賞!
翻譯自: https://www.javacodegeeks.com/2019/01/different-states-java-threads.html
總結
以上是生活随笔為你收集整理的Java线程的不同状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你在干什么用英语怎么说 怎么说你在干什么
- 下一篇: q7goodies事例_Java 8 F