一、什么是Java線程狀態(tài)
在Java程序中,用于描述Java線程的六種狀態(tài):
新建(NEW):當(dāng)前線程,剛剛新建出來,尚未啟動。
運(yùn)行(RUNNABLE):當(dāng)前線程,處于競爭CPU時間分片或已經(jīng)獲得CPU時間片的狀態(tài)。
等待(WAITTING):當(dāng)前線程,處于休眠,不參與CPU時間片競爭的狀態(tài)。
定時等待(TIMED_WAITTING):當(dāng)前線程,處于定時休眠,暫時不參與CPU時間片競爭的狀態(tài)。
阻塞(BLOCKED):當(dāng)前線程,處于阻塞,不參與CPU時間片競爭的狀態(tài)。
終止(TERMINATED):當(dāng)前線程,處于最終停止的狀態(tài)。
新建狀態(tài),只能進(jìn)入運(yùn)行狀態(tài)。而終止?fàn)顟B(tài)無法再轉(zhuǎn)為其他狀態(tài)。
等待/定時等待與阻塞,差別就是后者需要一個事件信號(如其他線程放棄當(dāng)前線程需要的排他鎖),才可以進(jìn)行狀態(tài)切換。當(dāng)然,強(qiáng)行關(guān)閉也是可以的。
Java線程的實(shí)現(xiàn)并不受JVM規(guī)范約束,故不同虛擬機(jī)的實(shí)現(xiàn),往往不同。目前主流的HotSpot是將每個Java線程直接映射到一個操作系統(tǒng)的原生線程,從而由操作系統(tǒng)完成一系列的線程調(diào)度
二、哪里看Java線程狀態(tài)
查看Java線程狀態(tài),主要存在三種方式:
java.lang.Thread.State下可以直接看到Java的六種線程狀態(tài)
Java運(yùn)行時,程序內(nèi)部可以通過Thread.getState()獲取目標(biāo)線程狀態(tài)
Java運(yùn)行時,程序外部可以通過jstack等工具,查看線程狀態(tài)
有關(guān)jstack等工具等使用,后續(xù)會有博客,專門闡述。
三、什么時候變換Java線程狀態(tài)
Java線程狀態(tài)的切換嘛。不啰嗦,直接上圖。
這張圖涵蓋了Java線程狀態(tài)切換的各類方法。相較網(wǎng)上一些圖片,更為詳盡一些。