Java多線程之線程狀態(tài)
關于Java線程的狀態(tài),有的人可能會說有4種狀態(tài),有的會說有5種,6種,總之各種各樣的說法可能都有。造成這種情況的原因是:有很多的書上常常把操作系統(tǒng)進程狀態(tài),線程狀態(tài)與Java線程狀態(tài)混在一起談。下面這個圖相信大家在講多線程的文章中都見到過(或類似):
這些其實是操作系統(tǒng)上的書上常會提到的5種 進程(process) 狀態(tài):new,ready,running,waiting,terminated。
其實最簡單的就是直接查看Java源碼,就知道Java中線程到底定義了幾種狀態(tài)。如果我們查看JDK源碼的話,就會發(fā)現(xiàn)Java語言中定義的線程狀態(tài)是不同于操作系統(tǒng)的,我們可以在Thread.State源碼中的注釋中看到,它說得很清楚:
These states are virtual machine states which do not reflect any operating system thread states。
也就是說Java語言中定義的這些狀態(tài)都是指虛擬機狀態(tài),它不反映任何操作系統(tǒng)的線程狀態(tài)。
以RUNNABLE狀態(tài)為例,源碼中的注釋是這樣說的:executing in the Java virtual machine(正在Java虛擬機中執(zhí)行)。至于它是否真正在執(zhí)行,不是我們要操心的事。
一個 Java 線程它所對應的操作系統(tǒng)內(nèi)核線程中的狀態(tài)可能有Running又有Ready,但在Java虛擬機層面則統(tǒng)一映射成了RUNNABLE 狀態(tài)。如果Java中覺得沒必要去區(qū)分這些狀態(tài),我們也就沒有必要去糾結這些了。
還有一些情況下,操作系統(tǒng)也許只有一種狀態(tài),但在Java中又作了細分,給出了三種不同的狀態(tài),例如會把Java狀態(tài)中的 BLOCKED,WAITING,TIMED_WAITING 三種狀態(tài)都籠統(tǒng)地稱為 blocked 或者 waiting 。
又或者把TIMED_WAITING 狀態(tài)當作不存在,在很多文章中從來不提有這個狀態(tài),顯然,這種做法又是受到傳統(tǒng)進程狀態(tài)劃分的影響。盡管它與WAITING很像,我們最好按著 Thread.State 中的定義來,不要自己隨意發(fā)揮。
所以這就明白了,那些很多聲稱Java線程只有4種或5種狀態(tài)的文章,常常都是自作主張地合并了這些狀態(tài),把這些東西混為一談是非常容易引發(fā)混亂的,這個我們將會在后面具體談到。
綜上所述,為避免出現(xiàn)混亂,厘清概念所處的層次是非常重要的。
下面我們就以 JDK1.8 源碼中為標準,分別給大家介紹一下Java線程的這6種狀態(tài),下面我們先來看一下 JDK 中對于線程狀態(tài)的定義都有哪些。
線程的6種狀態(tài)
在 Thread 類的一個內(nèi)部枚舉類 Thread.State 中明確地定義這6種狀態(tài),如下圖所示:
狀態(tài)含義:
- 新建態(tài) (NEW):一個尚未啟動的線程處于這一狀態(tài)。(A thread that has not yet started is in this state.)
- 運行態(tài)(RUNNABLE):一個正在 Java 虛擬機中執(zhí)行的線程處于這一狀態(tài)。(A thread executing in the Java virtual machine is in this state.)
- 阻塞態(tài)(BLOCKED):一個正在阻塞等待一個監(jiān)視器鎖的線程處于這一狀態(tài)。(A thread that is blocked waiting for a monitor lock is in this state.)
- 等待態(tài)(WAITING):一個正在無限期等待另一個線程執(zhí)行一個特別的動作的線程處于這一狀態(tài)。(A thread that is waiting indefinitely for another thread to perform a particular action is in this state.)
- 計時等待(TIMED_WAITING):一個正在限時等待另一個線程執(zhí)行一個動作的線程處于這一狀態(tài)。(A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.)
- 終止態(tài)(TERMINATED):一個已經(jīng)退出的線程處于這一狀態(tài)。(A thread that has exited is in this state.)
在程序運行的某個給定時間點上,一個Java線程只能處于這6種狀態(tài)中的一種。
通過上面的介紹,相信大家就可以很清晰的、明確的知道Java線程狀態(tài)到底有幾種狀態(tài),又分別都有哪些狀態(tài)了,雖然可能對各個線程狀態(tài)的詳細含義還不是特別了解,別著急,后面我們會逐一介紹,請大家多多關注后續(xù)文章。
參考:
關于Java的線程狀態(tài)