ThreadDump中线程状态矛盾:Runnable与Waiting共存的原因
线程状态差异问题解析
线程Dump内容
"RVNUSDT-InstrumentAggregation" #168 prio=5 os_prio=0 tid=0x00007fba795e3000 nid=0x22be runnable [0x00007fb9c41c0000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000005c1409df0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:550) at com.superatomfin.athena.feed.InstrumentAggregation.run(InstrumentAggregation.java:51)
问题
第一行显示线程处于Runnable状态,但第二行显示线程处于Waiting状态,为何会出现这种差异?
解答
这是因为两行展示的是不同层面的线程状态:
- 第一行的
runnable是操作系统层面的线程状态:当Java线程调用Unsafe.park()这类本地方法时,操作系统会将线程标记为可运行状态——因为park操作并没有让线程进入操作系统的阻塞队列,只是处于等待调度的状态,所以OS层面显示为runnable。 - 第二行的
WAITING (parking)是Java虚拟机层面的线程状态:按照Java线程规范,线程调用LockSupport.park()后会进入WAITING状态,此时它在等待ConditionObject的唤醒信号,不会执行用户业务代码,属于主动等待唤醒的状态。
内容的提问来源于stack exchange,提问作者wsss
相关产品推荐
相关产品推荐

