2011-12-28 2 views
2

を呼び出す前に、オブジェクトを待っている全てのスレッドを取得する私が持っているコード&の束プロセッサは、小さい
時々パフォーマンスの問題(100ミリ秒)を作成するので、私はスレッドが現在待っているかを知りたい、notifyAllを呼び出しますリリースされるオブジェクト。私はobj.notifyAll()のnotifyAll

+0

通知する前にすべてのスレッドの待機を停止したい場合は、notifyAll()を呼び出すとどうなりますか?とにかく、私はそれがJavaの同期を使用して実行可能だとは思わない、あなたはいくつかの障壁またはそれらを追跡するために何かを利用可能なロックを使用して自分自身をロックを発明する必要があります。 – Fredrik

+0

ありがとう..私の以前の質問を受け入れる..答え..、私はそれを認識していなかった..、私は今、後で気をつけます..、 &私は前のスレッドが待つのを止めたくない、 ..特定のスレッドが必要かどうかを確認してください... –

答えて

7

を呼び出す前にリリースされ得るためにオブジェクトを待っている全てのスレッドを印刷したい

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); 
    } 
} 
+0

ああ、私はデバッグ目的のためにそれらをリストしたいと思っています...答えてくれてありがとう、私はすべてのスレッドダンプを印刷しようとします。それは私の考えを与えることができる 私は2つのプロジェクトが1つのバージョンを変更しているので&&私はそれらを比較している、私はnotifyallが両方の場所で時間の同じ量を取る必要があります期待してください 私はスレッドのダンプが問題を解決すると思います。 ..それを試してみよう... –

+0

スレッドの状態を含むスレッド情報を「ロック」情報と共にダンプするサンプルスニペットを投稿に編集しました。がんばろう。 –

+0

これはJEE環境で動作しますか? –

1

あなたはThread.getAllStackTracesを(使用)と待っているすべてのスレッドをプリントアウトすることができます。

関連する問題