VisualVM - 线程状态

时间:2014-12-10 16:35:54

标签: java jvm visualvm jvisualvm

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

enter image description here

这是我发现的:

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

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

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

感谢。

2 个答案:

答案 0 :(得分:44)

我已经使用了谷歌,第一页出现了一个非常漂亮的图表,几乎描述了你需要/想知道的所有内容。下次值得尝试谷歌这些类型的问题。

enter image description here

1)新

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

2)Runnable

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

3)跑步

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

4)等待等待

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

  • 的Thread.sleep(休眠时间)
  • 的Object.wait(超时)
  • 的Thread.join(超时)
  • LockSupport.parkNanos(超时)
  • LockSupport.parkUntil(超时)

5)非可运行(被阻止)

这是线程仍处于活动状态但当前没有资格运行的状态。

6)终止

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

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

<强>停车场:

  

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

如果您想以这种方式调用线程,则线程正在停止或暂停,因为它没有执行权限。授予权限后,线程将被取消并执行。

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

答案 1 :(得分:29)

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线程状态的简短(和非权威)讨论here

编辑添加:

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