VisualVM - 线程状态

Ali*_*med 72 java jvm visualvm jvisualvm

有人可以解释我的区别Sleeping,Wait,Park,和Monitor线程状态中的VisualVM.

在此输入图像描述

这是我发现的:

Running:线程仍在运行.
Sleeping:thread正在休眠(在线程对象上调用方法yield())
Wait:线程被互斥锁或屏障阻塞,并且正在等待另一个线程释放锁
Park:挂起的线程被暂停,直到它们被给予许可.取消停放线程通常是通过在线程对象上调用方法unpark()来完成的
Monitor:线程正在等待条件变为true以恢复执行

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

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

谢谢.

Mac*_*gan 48

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

在此输入图像描述

1)新的

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

2)Runnable

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

3)跑步

如果线程调度程序已选择它,则线程处于运行状态.

4)等待时间

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

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

5)非可运行(被阻止)

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

6)终止

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

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

停车处:

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

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

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


Jer*_*emy 32

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

BLOCKED -> Monitor
RUNNABLE -> Running
WAITING/TIMED_WAITING -> Sleeping/Park/Wait (see below)
TERMINATED/NEW -> Zombie
Run Code Online (Sandbox Code Playgroud)

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

Sleeping: specifically waiting in Thread.sleep().  
Park:     specifically waiting in sun.misc.Unsafe.park() (presumably via LockSupport).
Run Code Online (Sandbox Code Playgroud)

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

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

编辑添加:

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

  • 这应该是正确的答案。问题是关于 JVisualVM 线程状态而不是 JVM 线程状态。 (4认同)