VisualVM - 线程状态

100
请问有人能够解释一下VisualVM中 Sleeping, Wait, Park, 和 Monitor 线程状态之间的区别吗?

Running: 线程仍在运行。
Sleeping: 线程正在睡眠(线程对象上调用了yield()方法)。
Wait: 线程被互斥锁或屏障阻塞,正在等待另一个线程释放锁。
Park: 被停泊的线程被暂停,直到它们获得许可。解除停泊线程通常是通过在线程对象上调用unpark()方法来完成的。
Monitor: 线程正在等待条件成立以恢复执行。

我不理解 Park 状态,是什么使线程暂停执行的呢?如何在代码中检测线程暂停执行的原因?能否指导一下,谢谢!
2个回答

63

我找到了一个非常好的图表,基本上描述了你需要或想要知道的一切。

enter image description here

  1. 新线程

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

  1. 可运行

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

  1. 正在运行

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

  1. 限时等待

限时等待是指线程状态,即线程等待指定的等待时间。由于调用以下方法之一并指定正等待时间,因此线程处于定时等待状态:

  • Thread.sleep(sleeptime)
  • Object.wait(timeout)
  • Thread.join(timeout)
  • LockSupport.parkNanos(timeout)
  • LockSupport.parkUntil(timeout)
  1. 非可运行(阻塞)

当线程仍然存活但当前不符合运行条件时,就处于这种状态。

  1. 终止

当 run() 方法退出时,线程处于终止或死亡状态。

希望这回答了你的问题 :)

挂起:

除非许可可用,否则为线程调度目的禁用当前线程。

如果没有执行权限,线程将被挂起或暂停。一旦权限被授予,线程将被解除挂起并执行。

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


谢谢您的回复。我也看过了,但是我的问题仍然没有得到解答。您能否再次查看我的问题;我已经更新了它。我特别关注停车状态方面的答案。 - Ali Shah Ahmed
感谢您的更新。那么在停车状态下,线程是在等待被调度还是在等待某些条件? - Ali Shah Ahmed
@AliShahAhmed 线程正在等待许可(条件)执行 - 如果在一定时间内未满足此条件,则达到超时并终止线程 - PS。抱歉回复晚了哈哈 - Maciej Cygan

60

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

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

SleepingPark是(定时)等待的特例:

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

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

可以在这里简要地(非权威性地)讨论Java线程状态。

编辑后添加:

值得注意的是,在调用本地方法时被阻塞的线程在JVM中显示为RUNNABLE,因此在VisualVM中报告为Running(以及消耗100%的CPU)。


6
这应该是正确答案。问题涉及 JVisualVM 的线程状态,而不是 JVM 的线程状态。 - digital_infinity
你能添加一下你在哪里找到有关线程在调用本地方法时阻塞的信息的参考吗? - krionz
这是否意味着无法通过VisualVM中的线程状态图确定线程实际上是在执行某些操作还是在等待I/O发生? - Yar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接