可视VM – 线程状态
有人可以解释一下Visual VM中Sleeping
, Wait
, Park
和Monitor
线程状态的区别。
这是我发现的:
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
Sleeping
和Park
是特定的(定时)等待的情况:
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)。