VisualVM - 线程状态

2022-08-31 10:57:36

有人可以解释一下 VisualVM 中 、 、 和线程状态之间的区别吗?SleepingWaitParkMonitor

enter image description here

这是我发现的:

Running:线程仍在运行。
:线程处于休眠状态(在线程对象上调用了 yield() 方法)
:线程被互斥体或屏障阻止,并且正在等待另一个线程释放锁
:停放的线程被挂起,直到它们获得许可。取消停放线程通常是通过在线程对象
上调用方法 unpark() 来完成的:线程正在等待条件变为 true 以恢复执行SleepingWaitParkMonitor

我无法理解的是州立公园,实际上是什么暂停了线程?如何在代码中检测导致线程暂停执行的原因?

有人可以在这方面指导我吗?

谢谢。


答案 1

我发现了一个非常好的图表,它几乎描述了你需要/想知道的一切。

enter image description here

  1. 新增功能

如果创建 Thread 类的实例,但在调用 start() 方法之前,线程处于新状态。

  1. 可运行

调用 start() 方法后,线程处于可运行状态,但线程调度程序尚未选择它作为正在运行的线程。

  1. 运行

如果线程调度程序选择了线程,则该线程处于运行状态。

  1. 定时等待

定时等待是具有指定等待时间的线程的线程状态。线程处于定时等待状态,因为调用以下方法之一具有指定的正等待时间:

  • 线程.睡眠(睡眠时间)
  • Object.wait(超时)
  • 线程.连接(超时)
  • LockSupport.parkNanos(超时)
  • LockSupport.parkUntil(timeout)
  1. 不可运行(已阻止)

这是线程仍处于活动状态但当前不符合运行条件时的状态。

  1. 终止

线程在其 run() 方法退出时处于终止或死状态。

希望这能:)回答您的问题。

停车:

禁用当前线程以进行线程调度,除非许可证可用。

线程正在被停放或挂起,如果你喜欢这样称呼它,因为它没有执行的权限。授予权限后,线程将被取消停放并执行。

LockSupport的许可证与线程相关联(即许可证被授予特定线程)并且不会累积(即每个线程只能有一个许可证,当线程消耗许可证时,它会消失)。


答案 2

VisualVM 将 Java 线程状态(如@Maciej的答案中所述)映射到其 UI 中呈现的状态,如下所示:

BLOCKED -> Monitor
RUNNABLE -> Running
WAITING/TIMED_WAITING -> Sleeping/Park/Wait (see below)
TERMINATED/NEW -> Zombie

Sleeping并且是(定时)等待的特定情况:Park

Sleeping: specifically waiting in Thread.sleep().  
Park:     specifically waiting in sun.misc.Unsafe.park() (presumably via LockSupport).

(映射在 中执行。)ThreadMXBeanDataManager.java

可以在此处找到有关 Java 线程状态的简短(和非权威)讨论。

已编辑以添加:

还值得注意的是,在调用本机方法时阻塞的线程在 JVM 中显示为 ,因此 VisualVM 将其报告为(并且消耗 100% 的 CPU)。RUNNABLERunning


推荐