有人能给我解释一下VisualVM中Sleeping、Wait、Park和Monitor线程状态的区别吗?

这是我发现的:
Running:线程仍在运行。
Sleeping:线程正在休眠(在线程对象上调用了方法yield() )
Wait:线程被互斥锁或屏障阻塞,正在等待另一个线程释放锁
Park:暂留的线程将被挂起,直到获得许可为止。取消驻留线程通常是通过在线程对象上调用unpark()方法来完成的
Monitor:线程正在等待条件变为true以继续执行
我不能理解的是州立公园,到底是什么挂起了这条线?如何在代码中检测导致线程暂停执行的原因?
有人能在这方面给我指点一下吗?
谢谢。
发布于 2014-12-11 00:50:57
我发现了一个非常好的图表,它很好地描述了你需要/想知道的一切。

如果在调用start()方法之前创建thread类的实例,则线程处于新状态。
调用start()方法后,线程处于runnable状态,但线程调度程序尚未将其选择为正在运行的线程。
如果线程调度器选择了该线程,则该线程处于运行状态。
定时等待是线程在指定等待时间内等待的线程状态。线程由于在指定的正等待时间内调用以下方法之一而处于定时等待状态:
阻止(
这是线程仍然处于活动状态,但当前没有资格运行时的状态。
当一个线程的run()方法退出时,该线程处于终止或死状态。
希望这能回答您的问题:)。
停车场:
除非许可可用,否则
会出于线程调度目的禁用当前线程。
如果您喜欢以这种方式调用线程,则线程将被暂停或挂起,因为它没有执行的权限。一旦授予权限,线程将被取消驻留并执行。
LockSupport的许可与线程相关联(即,许可被给予特定的线程),并且不会累积(即,每个线程只能有一个许可,当线程使用该许可时,它将消失)。
发布于 2016-04-06 19:01:40
VisualVM将Java线程状态(如@Maciej的答案中所述)映射到其UI中显示的状态,如下所示:
BLOCKED -> Monitor
RUNNABLE -> Running
WAITING/TIMED_WAITING -> Sleeping/Park/Wait (see below)
TERMINATED/NEW -> ZombieSleeping和Park是(定时)等待的具体情况:
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)。
https://stackoverflow.com/questions/27406200
复制相似问题