Java多線程之線程狀態(tài)詳解之一
本文轉(zhuǎn)載自微信公眾號「我是開發(fā)者FTD」,作者FTD 。轉(zhuǎn)載本文請聯(lián)系我是開發(fā)者FTD公眾號。
從上一節(jié),我們已經(jīng)知道Java中線程一共有6種狀態(tài),在正式開始介紹之前,先給大家介紹一個監(jiān)控線程狀態(tài)的工具,也是JDK自帶的工具。通過這個工具,我們可以更清晰的看到線程此時此刻所處的狀態(tài)是什么。
找到 JDK 的安裝目錄,在bin目錄下可以找到JDK自帶的監(jiān)控工具VisualVM,例如我的目錄是D:\Program Files\Java\jdk1.8.0_251\bin\jvisualvm.exe,如下圖所示:
雙擊打開VisualVM,如下圖所示:
從上圖可以看到,我本地起了五個Java應(yīng)用,一個是VisualVM程序本身,一個就是IntelliJ IDE工具了,另外幾個是本地Java應(yīng)用。
我們雙擊VisualVM,可以在右邊欄看到它的一個運行情況,我們選擇切換到線程標(biāo)簽,就可以看到它當(dāng)前正在運行的線程的整體情況了。如下圖所示:
我們在右邊欄的下方,選擇一個線程,可以看到當(dāng)前線程是處于一個WAITING狀態(tài),顯示是在一個LinkedList對象上處于了等待,如下圖所示:
注:截圖中下方的 Thread inspector 窗體是一個插件,默認(rèn)是沒有安裝的,可在“菜單--工具--插件”下面找到它并安裝即可。如下圖所示:
注:我這里已經(jīng)安裝過了, 所以會在已安裝那里顯示
好了,有了這個工具后,我們就可以通過它來分析線程的狀態(tài)了,接下來我們再來一起看下Java中的這6個狀態(tài),首先從簡單的談起。
新建態(tài)(NEW)
當(dāng)使用new Thread()創(chuàng)建一個新的線程,又還沒有開始執(zhí)行(not yet started)它的時候就處于新建(NEW)狀態(tài)。這里所謂“開始執(zhí)行”具體指顯式的調(diào)用線程類中的start方法。
注:你不能直接調(diào)用run方法,這樣的話還是在原線程上執(zhí)行。只有調(diào)用start方法才會開啟新的執(zhí)行線程,接著它會去調(diào)用run。
在start之后,線程進(jìn)入RUNNABLE狀態(tài),之后還可能會繼續(xù)轉(zhuǎn)換成其它狀態(tài)。
注:一個線程只能被start一次。
終止態(tài)(TERMINATED)
終止?fàn)顟B(tài),這個也沒什么好說的,線程執(zhí)行完成后(completed execution)或者說線程退出了(exited),此時線程就進(jìn)入了終止?fàn)顟B(tài)。
其它狀態(tài)
余下的幾個狀態(tài),由于無法簡單幾句說完,這里先作些簡介,后面會一一詳細(xì)介紹:
- RUNNABLE:前面有提到,它指“正在Java虛擬機中執(zhí)行”,可能是ready,也可能是running,總之是在runnable。
- BLOCKED:等待監(jiān)視器鎖(waiting for a monitor lock )
這是一種特殊的waiting,實際上就是被synchronized方法或者塊阻塞。monitor有些書上通常叫管程,我也不太確定要怎么叫它。這里叫成 監(jiān)視器 也是取字面的意思。
- WAITING:無限期等待另一個線程執(zhí)行一個特別的動作。(waiting indefinitely for another thread to perform a particular action )
這里所謂的動作通常即是指“notify或是notifyAll”。
- TIMED_WAITING:限時等待另一個線程執(zhí)行一個動作。(waiting for another thread to perform an action for up to a specified waiting time )
如果沒有等到如“notify”之類的動作,時間到了也會自動退出這一狀態(tài)。
其他狀態(tài)我們在下篇開始一一詳解。