可视VM – 线程状态

有人可以解释一下Visual VM中SleepingWaitParkMonitor线程状态的区别。

在这里输入图像说明

这是我发现的:

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

我无法理解的是国家公园,究竟是什么挂了线? 如何在代码中检测线程暂停执行的内容?

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

谢谢。

我已经使用谷歌,并提出了第一页有一个非常好的图,这几乎可以描述所有你需要/想知道的。 下一次它的价值尝试谷歌这些types的问题。

在这里输入图像说明

1)新的

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

2)可运行

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

3)跑步

如果线程调度程序select了该线程,线程将处于运行状态。

4)定时等待

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

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

5)不可运行(阻止)

这是线程还活着的状态,但目前没有资格运行。

6)终止

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

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

停車處:

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

如果您想以这种方式调用线程,线程正处于暂停或暂停状态,因为它没有执行权限。 一旦授予权限,线程将被释放并执行。

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

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线程状态的简短讨论(非权威性)可以在这里find。

编辑添加:

另外值得注意的是,阻塞调用本地方法的线程作为RUNNABLE出现在JVM中,因此被VisualVM报告为正在Running (并且消耗100%的CPU)。