有人可以解释一下VisualVM中Sleeping
,Wait
,Park
和Monitor
线程状态之间的区别。
这是我发现的:
Running
:线程仍在运行。
Sleeping
:线程正在休眠(在线程对象上调用方法yield())
Wait
:线程被互斥锁或屏障阻塞,正在等待另一个线程释放锁定
Park
:暂停线程暂停,直到获得许可。取消停放线程通常是通过在线程对象上调用方法unpark()来完成的
Monitor
:线程正在等待条件成为真,以恢复执行
我无法理解的是州立公园,实际上是什么暂停线程?如何在代码中检测到线程暂停执行的原因?
有人可以在这方面指导我。
感谢。
答案 0 :(得分:44)
我已经使用了谷歌,第一页出现了一个非常漂亮的图表,几乎描述了你需要/想知道的所有内容。下次值得尝试谷歌这些类型的问题。
1)新
如果在创建Thread类的实例但在调用start()方法之前,线程处于新状态。
2)Runnable
调用start()方法后线程处于runnable状态,但是线程调度程序没有选择它作为正在运行的线程。
3)跑步
如果线程调度程序选择了线程,则线程处于运行状态。
4)等待等待
定时等待是等待指定等待时间的线程的线程状态。由于在指定的正等待时间内调用以下方法之一,线程处于定时等待状态:
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
Sleeping
和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)