[英]Java list of waiting threads
有沒有辦法獲取對象的等待線程/等待線程數列表?
如果您使用synchronized
關鍵字 - 沒有。 但是,如果您使用的是java.util.concurrent
鎖,則可以。
ReentrantLock
有一個受保護的方法getWaitingThreads()
。 如果你擴展它,你可以公開它。
更新:您正在使用.wait()
和.notify()
,因此您可以在.wait()
調用list.add(Thread.currentThread()
之前手動填充並清空List<Thread>
- 並在每個之前刪除它通知。這不完美,但實際上你不應該需要這樣的清單。
您可以使用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,您可以使用線程組查找所有線程,然后檢查線程堆棧以了解有關他們在等待的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.