を呼び出す前に、オブジェクトを待っている全てのスレッドを取得する私が持っているコード&の束プロセッサは、小さい
時々パフォーマンスの問題(100ミリ秒)を作成するので、私はスレッドが現在待っているかを知りたい、notifyAll
を呼び出しますリリースされるオブジェクト。私はobj.notifyAll()
のnotifyAll
答えて
を呼び出す前にリリースされ得るためにオブジェクトを待っている全てのスレッドを印刷したい
synchronized (obj){
//do some stuff..
obj.notifyall();
}
は、同じ条件のためにリソースを待っている全てのスレッドはありますか?はいの場合は、obj.notifyAll
の代わりにobj.notify()
を置き換えることができますが、実際にはお勧めできません。 AFAIK、与えられたオブジェクトを待っているすべてのスレッドのリストを "取得"する方法はありません(ただし、プログラム的にスレッドダンプを取得してスレッドを見ることはできますが、マインド)。たとえあったとしても、スレッドをリストしてから「何か」をすることは、確かにnotifyAll
にかかる時間以上かかるでしょう。
また、「プロセッサーが小さい」場合は、「実際の」スレッドがかなりの量でないと、スレッド数が制限されるため、スレッド数が多すぎるとオーバーヘッドになることがあります。そうすれば、notifyAll
はスレッドの束を起こさないでしょう。ここで
はインライン化コメントをスレッド状態情報のダンプを示している小さなプログラムです:
package net.sanjayts.test;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.util.concurrent.TimeUnit;
public class ThreadDumpTest {
public static void main(String[] args) throws Exception {
final Object lock = new Object();
for (int i = 0; i < 6; ++i) {
final int cnt = i;
new DaemonThread(new Runnable() {
@Override
public void run() {
try {
// If counter is even, try to acquire common lock and then
// sleep. If odd, sleep without trying to acquire the lock.
// This way, if we do a thread dump, we'll see threads in
// different states (TIMED_WAIT for those sleeping threads
// and BLOCKED for those waiting for the common "lock".
if (cnt % 2 == 0) {
synchronized (lock) {
TimeUnit.MINUTES.sleep(1); // sleep 1 min
}
} else {
TimeUnit.MINUTES.sleep(1); // sleep 1 min
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "mythread-" + cnt).start();
}
ThreadInfo[] infos = ManagementFactory.
getThreadMXBean().dumpAllThreads(true, true);
for (ThreadInfo info : infos) {
System.out.println(info);
System.out.println("===========================");
}
TimeUnit.SECONDS.sleep(2);
}
}
class DaemonThread extends Thread {
public DaemonThread(Runnable r, String name) {
super(r, name);
setDaemon(true);
}
}
ああ、私はデバッグ目的のためにそれらをリストしたいと思っています...答えてくれてありがとう、私はすべてのスレッドダンプを印刷しようとします。それは私の考えを与えることができる 私は2つのプロジェクトが1つのバージョンを変更しているので&&私はそれらを比較している、私はnotifyallが両方の場所で時間の同じ量を取る必要があります期待してください 私はスレッドのダンプが問題を解決すると思います。 ..それを試してみよう... –
スレッドの状態を含むスレッド情報を「ロック」情報と共にダンプするサンプルスニペットを投稿に編集しました。がんばろう。 –
これはJEE環境で動作しますか? –
あなたはThread.getAllStackTracesを(使用)と待っているすべてのスレッドをプリントアウトすることができます。
- 1. スレッドnotifyAll()
- 2. notifyAll()not working、notifyAllどのようにソケットプログラミングのすべてのスレッド
- 3. java.lang.IllegalMonitorStateException on notifyAll()メソッド
- 4. Java待機とnotifyAll
- 5. Javaスレッドnotify()とnotifyAll()
- 6. 指示されたnotifyAll()
- 7. ArrayListを使用したIllegalMonitorStateException NotifyAll()Wait()
- 8. プロデューサ/コンシューマアプリケーションで通知するvs notifyAll
- 9. notifyとnotifyAllのコード/同期(理解するためのヘルプ)
- 10. 私のコードでnotifyAll()メソッドが動作していません
- 11. Javaは()、のnotifyAll()を通知し、待ちます()メソッド
- 12. notifyAllはスレッドを呼び起こさない
- 13. waitとnotifyAllを使用するとJavaプログラムがフリーズします
- 14. Javaコードでnotify()とnotifyAll()がJavaコードで機能しない
- 15. notifyAllを使用してスレッドを再開する
- 16. どのように私はwait/notifyAllを使用するのですか?
- 17. なぜ、wait、notifyおよびnotifyAllはCloneableのようなObjectクラスのメソッドです
- 18. なぜ、wait、notifyおよびnotifyAllメソッドがオブジェクトクラスにあるのですか?
- 19. Java - notifyAll()とnotify()は失敗しましたか?出来ますか?
- 20. notifyallはC++マルチスレッドでは動作しません。デッドロックが発生する
- 21. この例では、notifyAll()がすべてのスレッドをウェイクしていないのはなぜですか?
- 22. 同期されたオブジェクトはnotifyAll()の前にスレッドによってロックされません
- 23. NotifyAllが正常に動作していません:スレッドの実行順序を制御するプログラム - 連続した整数の印刷
- 24. なぜnotifyAll()関数がここで動作していないのですか?どうすれば編集できますか?
- 25. は<code>synchronize threads</code>に十分であることは、私たちが実際に待機を使用する必要がある場合は、<code>notify</code>と<code>notifyAll</code>メソッドをJavaの
- 26. 範囲の前にRLockマップする必要がありますか?
- 27. wait()とnotify()メソッドをログに記録するより良い方法を探しています
- 28. Javaコードセクションにモニタがあるようにする方法
- 29. なぜコンシューマスレッドはVectorからメッセージを削除できないのですか?
- 30. C#の同期メソッド
通知する前にすべてのスレッドの待機を停止したい場合は、notifyAll()を呼び出すとどうなりますか?とにかく、私はそれがJavaの同期を使用して実行可能だとは思わない、あなたはいくつかの障壁またはそれらを追跡するために何かを利用可能なロックを使用して自分自身をロックを発明する必要があります。 – Fredrik
ありがとう..私の以前の質問を受け入れる..答え..、私はそれを認識していなかった..、私は今、後で気をつけます..、 &私は前のスレッドが待つのを止めたくない、 ..特定のスレッドが必要かどうかを確認してください... –