You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:55:27