有没有办法获取一个等待线程列表/一个对象上等待线程的数量?
答案 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,您可以使用线程组找出所有线程,然后检查线程堆栈以找出它们正在等待的对象。