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