有没有一种方法可以获取对象上等待线程的列表/等待线程的数量?
synchronized
关键字 - 不行。但是如果您使用的是 java.util.concurrent
锁,则可以。
ReentrantLock
有一个受保护的方法 getWaitingThreads()
。如果您扩展它,可以将其设为公共的。.wait()
和 .notify()
,因此您可以手动填充和清空一个 List<Thread>
- 在每个 .wait()
调用之前调用 list.add(Thread.currentThread())
,并在每个 notify 之前将其删除。这不是完美的,但实际上您不应该需要这样的列表。wait()
时,可以将线程手动添加到列表中。然后,在调用notify时,将其从列表中删除。 - BozhoThreadInfo[] 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());
}
}
ManagementFactory.getThreadMXBean()
是了解所有等待对象的线程的最佳方法
对于JDK 1.6之前的版本,您可以使用线程组查找所有线程,然后检查线程堆栈以了解它们正在等待哪个对象。