等待线程的Java列表

时间:2011-10-28 12:37:55

标签: java multithreading

有没有办法获取一个等待线程列表/一个对象上等待线程的数量?

3 个答案:

答案 0 :(得分:10)

如果您使用synchronized关键字 - 没有。但是如果你使用java.util.concurrent锁,你可以。

ReentrantLock有一个受保护的方法getWaitingThreads()。如果你扩展它,你可以公开它。

更新:您正在使用.wait().notify(),因此您可以在List<Thread>来电.wait()之前手动填写并清空list.add(Thread.currentThread(),然后删除它在每次通知之前。它并不完美,但实际上你不需要这样的清单。

答案 1 :(得分:9)

您可以使用JMX类来检查线程:

ThreadInfo[] infos = ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);

每个被阻止的线程都有一个非空LockInfo关联,可以让您识别它正在等待的对象:

for (ThreadInfo info : infos) {
    LockInfo lockInfo = info.getLockInfo();
    if (lockInfo != null 
            && lockInfo.getClassName().equals(lock.getClass().getName()) 
            && lockInfo.getIdentityHashCode() == System.identityHashCode(lock)) {

        System.out.println("Thread waiting on " + lock + " : " + info.getThreadName());
    }
}

答案 2 :(得分:2)

如果您使用的是JDk 1.6,则ManagementFactory.getThreadMXBean()是查找等待对象的所有线程的最佳方法 对于1.6之前的JDK,您可以使用线程组找出所有线程,然后检查线程堆栈以找出它们正在等待的对象。