天天看點

java.lang Enum Thread.State,jstack顯示的線程狀态說明

java docs 寫道 http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html

public static enum Thread.State
extends Enum<Thread.State>
A thread state. A thread can be in one of the following states:
NEW
A thread that has not yet started is in this state.
建立,但沒啟動
RUNNABLE
A thread executing in the Java virtual machine is in this state.
正在運作
BLOCKED
A thread that is blocked waiting for a monitor lock is in this state.
阻塞,正在等待鎖(臨界資源)如:進入synchroinzed block方法或者重進入synchronize block方法,
注:java是支援重入reentrant 的。
WAITING
A thread that is waiting indefinitely for another thread to perform a particular action is in this state.
等待,無限等待另一個線程執行一個特定動作
常見的如下:
         * <ul>
         *   <li>{@link Object#wait() Object.wait} 但沒有設定等待時間</li>
         *   <li>{@link #join() Thread.join} 但沒有設定等待時間</li>
         *   <li>{@link LockSupport#park() 但沒有設定等待時間}</li>
         * </ul>
TIMED_WAITING
A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.
         * <ul>
         *   <li>{@link #sleep Thread.sleep}</li>
         *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
         *   <li>{@link #join(long) Thread.join} with timeout</li>
         *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
         *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
         * </ul>
定時等待
等待另一個線程執行,并設定了一個具體的等待時間(逾時)
TERMINATED
A thread that has exited is in this state.
A thread can be in only one state at a given point in time. These states are virtual machine states which do not reflect any operating system thread states.
終止,
線程已經退出執行時。
Since:
1.5
           

對比jstack回報的線程狀态

[[email protected] opt]# jstack 18984|grep Thread.State

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: TIMED_WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: TIMED_WAITING (on object monitor)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: WAITING (parking)

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: BLOCKED (on object monitor)

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: BLOCKED (on object monitor)

   java.lang.Thread.State: TIMED_WAITING (parking)

   java.lang.Thread.State: WAITING (on object monitor)

   java.lang.Thread.State: TIMED_WAITING (on object monitor)

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: RUNNABLE

   java.lang.Thread.State: WAITING (on object monitor)

   java.lang.Thread.State: WAITING (on object monitor)

jetty

"qtp458209687-970" #970 prio=5 os_prio=0 tid=0x00007fa8c001f000 nid=0x6df9 runnable [0x00007faa465e4000]

   java.lang.Thread.State: RUNNABLE

at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)

at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)

at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)

at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)

- locked <0x00000005ca9b2b48> (a sun.nio.ch.Util$2)

- locked <0x00000005ca9b2b38> (a java.util.Collections$UnmodifiableSet)

- locked <0x00000005ca9b2910> (a sun.nio.ch.EPollSelectorImpl)

at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)

at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)

at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.select(ManagedSelector.java:233)

at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.produce(ManagedSelector.java:181)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:171)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:156)

at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)

at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)

at java.lang.Thread.run(Thread.java:745)

上面的on object monitor 是等某個對象了,如object.wait

上面的parking,java 1.6 中LockSupport 有park方法,這個park主要是給上層提供更抽象的同步原語用的。

jstack會檢查是否死鎖,deadlock.

如果太多的BLOCKED,程式往往是陷入死鎖或者饑餓了。