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