如何匹配理论线程状态和jvisualvm显示的状态

How to match theoretical thread states and states showed by jvisualvm

如果我们将 google 类似 'java thread state' 的东西,我们将看到大致如下图:

但是如果我们打开 jVisualVm,​​我们将看到以下内容:

你能帮忙配一下这些图吗?

睡眠状态就Thread.sleep()? 运行 的特例?

公园州是什么?(我试过google但我很困惑,因为我之前只知道第一张图)

公园是

sun.misc.Unsafe.park()

图表表示 java.lang.Thread.State 枚举。 The Javadoc is quite helpful to get an understanding of the mapping you seek.

JVisualVM 状态表示您将在线程转储中看到的额外状态描述,例如:

 "Finalizer" daemon prio=8 tid=0x022f4000 nid=0xd14 in Object.wait() [0x044cf000]
    java.lang.Thread.State: WAITING (on object monitor)

因此,如果您获得线程转储并通过线程名称比较来自 JVisualVM 的状态和线程转储,您就可以自行破译状态。

这是你想要的映射:

  • Running -> java.lang.Thread.State: RUNNABLE
  • Sleeping -> java.lang.Thread.State: TIMED_WAITING (sleeping)
  • Wait -> java.lang.Thread.State: WAITING TIMED_WAITING (on object monitor)
  • Park -> java.lang.Thread.State: WAITING TIMED_WAITING (parking)
  • Monitor -> java.lang.Thread.State: BLOCKED (on object monitor)

Park状态是WAITINGTIMED_WAITING的特例。与 Wait 的区别在于 Wait 发生在对象监视器上(即 Object.wait()synchronized 块中)。另一方面,Park 通过 Unsafe.park 从调度中删除一个线程,而不需要持有监视器(即它不需要 synchronized 块)。