参考链接:
situation1/2使得线程状态从RUNNING转化为WAITING/TIMED_WAITING
还有一种情况就是IO阻塞,例子如下:
import java.util.concurrent.ArrayBlockingQueue;
public class c
{
private static ArrayBlockingQueue<String> blockingQueue = new ArrayBlockingQueue<String>(1);
public static void main(String[] args)
{
blockingQueue.add("Str1");
try
{
blockingQueue.put("Str2");
}catch(Exception e)
{
e.printStackTrace();
}
}
}
~
jstack输出如下:
2017-02-14 10:10:48
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.80-b11 mixed mode):
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)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007d7004858> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x00000007d7004858> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007d7004470> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
- locked <0x00000007d7004470> (a java.lang.ref.Reference$Lock)
"main" prio=10 tid=0x00007f4038008800 nid=0x30e6 waiting on condition [0x00007f403ccc7000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007d704a740> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.ArrayBlockingQueue.put(ArrayBlockingQueue.java:324)
at c.main(c.java:12)
"VM Thread" prio=10 tid=0x00007f4038071000 nid=0x30ef runnable
"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f403801e000 nid=0x30e7 runnable
"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f4038020000 nid=0x30e8 runnable
"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007f4038022000 nid=0x30e9 runnable
从以上输出我们要注意
WAITING(parking)
这段字符串说明了目前线程的状态
还需要注意:
- parking to wait for <0x00000007d704a740> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
说明了线程WAITING的地方