Java等待线程列表

8
有没有一种方法可以获取对象上等待线程的列表/等待线程的数量?

为了编程目的还是为了找出如何解决活性问题? - Ingo Kegel
@Bozho 我想要同步具有相同参数的线程。我通过拥有一个参数<->对象映射来实现这一点。因此,任何线程都会检查这个映射,并在其他线程正在运行时调用object.wait()(Object将保存一个变量来告诉这一点),原始线程总是调用notify(),因此等待的线程中的一个会恢复执行。 - Rnet
@Bozho 问题在于参数<->对象映射正在累积值。因此,在通知后只有当没有线程等待时才需要删除条目。 - Rnet
3个回答

11
如果您正在使用 synchronized 关键字 - 不行。但是如果您使用的是 java.util.concurrent 锁,则可以。 ReentrantLock 有一个受保护的方法 getWaitingThreads()。如果您扩展它,可以将其设为公共的。
更新:您正在使用 .wait().notify(),因此您可以手动填充和清空一个 List<Thread> - 在每个 .wait() 调用之前调用 list.add(Thread.currentThread()),并在每个 notify 之前将其删除。这不是完美的,但实际上您不应该需要这样的列表。

我只使用wait()和notify(),因为我需要根据线程所携带的特定值来同步特定的线程。 - Rnet
1
好的,当您调用wait()时,可以将线程手动添加到列表中。然后,在调用notify时,将其从列表中删除。 - Bozho

9
您可以使用JMX类来检查线程:
ThreadInfo[] 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());
    }
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接