等待线程的Java列表

Rne*_*net 7 java multithreading

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

Boz*_*zho 10

如果您使用的是synchronized关键字 - 没有.但是如果你使用java.util.concurrent锁,你可以.

ReentrantLock有一个受保护的方法getWaitingThreads().如果你扩展它,你可以公开它.

更新:您正在使用.wait().notify(),因此您可以在每次通知List<Thread>之前手动填写并清空- 在wach .wait()通话之前list.add(Thread.currentThread(),并将其删除.它并不完美,但实际上你不应该需要这样的清单.


Emm*_*urg 9

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

ThreadInfo[] infos = ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);
Run Code Online (Sandbox Code Playgroud)

每个被阻塞的线程都有一个非空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());
    }
}
Run Code Online (Sandbox Code Playgroud)