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