jdk里面定義的線程狀態有:
public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; }
但是jstack里面輸出的就沒有這么簡潔,問題追蹤變得復雜
首先看一下線程狀態輪換圖
雖然線程狀態整體分為:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED,但是這個粒度太粗了,甚至不知道什么導致的WAITING。
(一). 較容易理解的線程狀態引起原因
1. BLOCKED (on object monitor)
2個線程獲取同一個鎖,A線程得到鎖並占有,那么B線程就是此種狀態
2. WAITING (on object monitor)、TIMED_WAITING (on object monitor)
線程調用了wait調用了,等待被喚醒。TIMED_WAITING (on object monitor)調用了帶時間的wait方法。
3. TIMED_WAITING (parking)、TIMED_WAITING (on object monitor)
線程調用了park方法,TIMED_WAITING (parking)調用了帶時間的park方法
4. TIMED_WAITING (sleeping)
線程調用了sleep方法,WAITING是不存在sleeping的,因為sleep方法都帶時間參數
(二). 不容易理解的線程狀態引起原因
1. waiting on condition
此種行為,表面線程在等待一個資源,比如http網絡請求阻塞了等,要注意此種現象
2. Runnable
此種狀態最容易理解,實踐表面如果線程一直是此種狀態,通過多次jstack如果發現一直處在一個方法上,那也應該是有問題,比如說死循環,網絡請求(有的網絡請求不一定看起來就是阻塞現象,因為它一直在運行)
一般CPU很忙時,則關注runnable的線程,CPU很閑時,則關注waiting for monitor entry的線程。