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