VisualVM-线程状态


85

有人可以解释我的区别SleepingWaitPark,和Monitor在VisualVM的线程状态。

在此处输入图片说明

这是我发现的:

Running:线程仍在运行。
Sleeping:线程正在睡眠(在线程对象上调用了method yield()方法)
Wait:线程被互斥锁或屏障阻止,并且正在等待另一个线程释放锁
Park:停放的线程被挂起,直到获得许可。通常通过在线程对象上调用方法unpark()来取消线程
Monitor:线程正在等待条件变为真以恢复执行

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

有人可以在这方面指导我。

谢谢。

Answers:


53

我发现了一个非常不错的图表,其中几乎描述了您需要/想要知道的所有内容。

在此处输入图片说明

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

  1. 可运行

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

  1. 跑步

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

  1. 定时等待

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

  • Thread.sleep(睡眠时间)
  • Object.wait(超时)
  • Thread.join(超时)
  • LockSupport.parkNanos(超时)
  • LockSupport.parkUntil(超时)
  1. 不可运行(已阻止)

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

  1. 已终止

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

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

停车处:

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

如果您希望以这种方式调用线程,则该线程将被驻留或暂停,因为它没有执行权限。一旦授予权限,该线程将被释放并执行。

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


感谢您的答复。我也经历了这个,但是我的问题仍然没有答案。您能否再回答我的问题?我已经更新了。我正在公园状态下寻找答案。
Ali Shah Ahmed

再次感谢您的更新。因此,在停放状态下,线程是在等待其调度,还是在某种条件下等待?
Ali Shah Ahmed

@AliShahAhmed线程正在等待执行权限(条件)-如果在一定时期内不满足此条件,并且线程终止-PS。抱歉延迟回答哈哈
Maciej Cygan 2016年

39

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中显示为RUNNABLE,因此被VisualVM报告为Running(消耗100%的CPU)。


2
这应该是正确的答案。问题是关于JVisualVM线程状态而不是JVM线程状态。
digital_infinity
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.