【问题标题】:VisualVM - Thread StatesVisualVM - 线程状态
【发布时间】:2015-02-08 22:53:48
【问题描述】:

谁能解释一下 VisualVM 中 SleepingWaitParkMonitor 线程状态之间的区别。

这是我发现的:

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

我无法理解的是国家公园,实际上是什么暂停了线程?如何在代码中检测是什么导致线程暂停执行?

有人可以在这方面指导我吗?

谢谢。

【问题讨论】:

    标签: java jvm visualvm jvisualvm


    【解决方案1】:

    我发现了一个非常好的图表,它几乎描述了您需要/想知道的所有内容。

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

    1. 可运行

    调用start()方法后线程处于可运行状态,但线程调度器并未选择它为运行线程。

    1. 正在运行

    如果线程调度程序选择了线程,则线程处于运行状态。

    1. 定时等待

    定时等待是线程等待指定等待时间的线程状态。线程由于调用以下方法之一并具有指定的正等待时间而处于定时等待状态:

    • Thread.sleep(sleeptime)
    • Object.wait(超时)
    • Thread.join(超时)
    • Lo​​ckSupport.parkNanos(超时)
    • Lo​​ckSupport.parkUntil(超时)
    1. 不可运行(阻塞)

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

    1. 已终止

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

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

    停车:

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

    如果您喜欢这样调用线程,线程将被停放或挂起,因为它没有执行权限。授予权限后,线程将被取消停放并执行。

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

    【讨论】:

    • 感谢您的回复。我也经历了这个,但不知何故我的问题仍然没有答案。请你再看一遍我的问题吗?我已经更新了它。我特别寻找答案w.r.t。公园州。
    • 再次感谢更新。那么在 park 状态下,线程是在等待它被调度还是在某些条件下等待?
    • @AliShahAhmed 线程正在等待执行权限(条件) - 如果在特定时间段内不满足此条件,则超时并终止线程 - PS。抱歉耽误了回复哈哈
    【解决方案2】:

    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中进行。)

    可以在here 找到关于 Java 线程状态的简短(非权威)讨论。

    编辑添加:

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

    【讨论】:

    • 这应该是正确的答案。问题是关于 JVisualVM 线程状态而不是 JVM 线程状态。
    • 您能否添加参考,您可以在其中找到有关调用本机方法的线程阻塞的信​​息?
    猜你喜欢
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2012-02-22
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多