java线程池返回线程状态_Java线程的不同状态
java線程池返回線程狀態
介紹
在Java中,線程可以具有狀態。 Thread.State枚舉定義Java線程可以具有的不同狀態。 該枚舉定義了以下值–
在隨后的部分中,我將簡要概述這些狀態以及它們之間的可能過渡。
Java線程的狀態
新
這是線程首次創建時獲得的默認狀態。
可運行
線程一開始執行,就立即進入RUNNABLE狀態。 請注意,等待獲取CPU來執行的線程仍處于此狀態。
已封鎖
一旦線程被阻塞以等待監視器鎖定,線程便立即進入BLOCKED狀態。 這可以通過以下兩種方式之一發生:
等候
線程由于調用以下方法之一而進入此狀態–
TIMED_WAITING
線程由于調用以下方法之一而進入此狀態–
已終止
線程終止后,它將立即移至該狀態。
可能的狀態轉換
下圖顯示了不同狀態之間可能的轉換–
安排執行線程后,它將立即進入RUNNABLE狀態。 已經用第一個箭頭(標記為1)顯示了此過渡。
從RUNNABLE狀態,線程可以移至BLOCKED,WAITING,TIMED_WAITING或TERMINATED狀態中的任何一個。 從理論上講,如果線程不等待獲取任何鎖,或者不Hibernate,或者不調用任何使其等待的方法,則它僅完成執行并直接進入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線程池返回線程狀態
總結
以上是生活随笔為你收集整理的java线程池返回线程状态_Java线程的不同状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何复制加密光盘电脑如何复制到光盘
- 下一篇: java8多线程运行程序_线程,代码和数