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

时间:2017-02-28 10:41:13

标签: java multithreading concurrency java-threads jvisualvm

如果我们要google类似于' java线程状态'我们将看到大约这个图:

enter image description here

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

enter image description here

你能帮忙修补这些图吗?

睡眠状态只是Thread.sleep()?跑步的特例?

Park的状态是什么?(我试图谷歌,但我很困惑,因为我之前只知道第一张图)

2 个答案:

答案 0 :(得分:1)

park是

sun.misc.Unsafe.park()

答案 1 :(得分:1)

该图表示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块)。