待機中のスレッドのJavaリスト

待っているスレッドのリスト/オブジェクト上の待ちスレッドの数を取得する方法はありますか?

7
プログラム的な目的のため
追加された 著者 Rnet,
@Bozho同じパラメータだけを持つスレッドを同期したいと思います。私はparams < - >オブジェクトマップを持つことでこれを行いました。つまり、他のスレッドが実行されている場合(Objectはこれを伝える変数を保持します)、元のスレッドは常にnotify()を呼び出し、待ちスレッドの1つが再開します。
追加された 著者 Rnet,
@Bozho問題はparamオブジェクトマップが値を累積していたことでした。したがって、スレッドが待機していないときに限り、通知後にエントリを削除する必要がありました。
追加された 著者 Rnet,
プログラム的な目的や生命の問題を解決する方法を見つけるために?
追加された 著者 Ingo Kegel,

3 答え

synchronized キーワードを使用している場合 - いいえ。しかし、あなたが java.util.concurrent ロックを使用している場合は、できます。

ReentrantLock has a protected method getWaitingThreads(). If you extend it, you can make it public.

Update: You are using .wait() and .notify(), so you can manually fill and empty a List<thread> - before wach .wait() call list.add(Thread.currentThread(), and remove it before each notify. It's not perfect, but actually you shouldn't need such a list.

10
追加された
まあ、 wait()を呼び出すと、スレッドを手動でリストに追加できます。通知を呼び出すと、それを削除する
追加された 著者 Bozho,
私は彼らが持っている値に基づいて特定のスレッドだけを同期させる必要があるので、wait()とnotify()だけを使用しています。
追加された 著者 Rnet,

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());
    }
}
9
追加された

JDk 1.6を使用している場合は、 ManagementFactory.getThreadMXBean()は、オブジェクトを待機しているすべてのスレッドを調べる最良の方法です 1.6より前のJDKでは、スレッドグループを使用してすべてのスレッドを見つけ出し、スレッドスタックを調べて、それらが待機しているオブジェクトについて調べることができます。

2
追加された