如何检查线程是不是处于休眠状态?

Posted

技术标签:

【中文标题】如何检查线程是不是处于休眠状态?【英文标题】:How to check if a thread is sleeping?如何检查线程是否处于休眠状态? 【发布时间】:2011-07-17 05:12:13 【问题描述】:

有什么方法可以检查给定线程是否正在休眠?

【问题讨论】:

我敢问你为什么需要这些信息? 是从您的代码中调用的 Thread.sleep()。知道线程正在睡觉你想要达到什么目的? 【参考方案1】:

我不确定是否有更好的方法,但是您可以在线程进入睡眠状态时更改变量并检查该变量是否线程处于睡眠状态。

【讨论】:

【参考方案2】:

你可以调用Thread.getState(),查看状态是否为TIMED_WAITING

注意,但是TIMED_WAITING 并不一定意味着调用sleep() 的线程,它也可能正在等待Object.wait(long) 调用或类似的调用。

【讨论】:

【参考方案3】:

您可以创建自己的 sleep 方法,将 线程的 ID 记录到 全局变量 并将其用作睡眠线程的参考。

没有其他方法可以判断线程是否正在睡眠。

希望以下三个链接有所帮助:

States Java Doc 1 Java Doc 2

【讨论】:

【参考方案4】:

这是一个检查其他线程是否正在休眠的丑陋技巧(调用Thread.sleep):

public static boolean isSleeping(Thread t) 
    StackTraceElement[] ste = t.getStackTrace();

    return ste.length > 0
        && ste[0].getClassName().equals("java.lang.Thread")
        && ste[0].getMethodName().equals("sleep");

【讨论】:

什么是 ParkSupport 和 Unsafe.park? 我总是把“java.util.concurrent.locks.LockSupport”误认为“ParkSupport”; impl 本身位于 sun.misc.Unsafe.park【参考方案5】:

我实际上并没有这样做,但是有一个 ThreadMXBean Interface 用于获取线程信息

它返回ThreadInfo Class,在那里你可能会用getWaitedTime方法得到一些东西。

【讨论】:

以上是关于如何检查线程是不是处于休眠状态?的主要内容,如果未能解决你的问题,请参考以下文章

Valgrind 使我的程序的所有线程都处于休眠状态

电脑休眠怎么唤醒?

如何在设备休眠时保持 GPS 处于全功率状态

java线程

所有 goroutine 都处于休眠状态 - 死锁

线程的等待状态