簡體   English   中英

等待線程的Java列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM