等待线程的Java列表

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

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

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

每个被阻塞的线程都有一个非null的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()); } } 

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