2009-09-03 7 views
1

同時に実行中の2つのスレッドの書き込みアクセスのグラフを描画する必要があります。スレッド自体に干渉することなく、これらのアクセスのタイムスタンプ値のペアを配列に書き込む最善の方法は何ですか?書き込まれるキューは、次のようになります。Javaでスレッドの振る舞いを分析する

import java.util.concurrent.atomic.AtomicInteger; 

class IQueue<T> { 
    AtomicInteger head = new AtomicInteger(0); 
    AtomicInteger tail = new AtomicInteger(0); 
    T[] items = (T[]) new Object[100]; 

    public void enq(T x) { 
     int slot; 
     do { 
      slot = tail.get(); 
     } while (! tail.compareAndSet(slot, slot+1)); 
     items[slot] = x; 
    } 

    public T deq() throws EmptyException { 
     T value; 
     int slot; 
     do { 
      slot = head.get(); 
      value = items[slot]; 
      if (value == null) 
       throw new EmptyException(); 
     } while (! head.compareAndSet(slot, slot+1)); 
     return value; 
    } 

    public String toString() { 
     String s = ""; 
     for (int i = head.get(); i < tail.get(); i++) { 
      s += items[i].toString() + "; "; 
     } 
     return s; 
    } 
} 

スレッドが書き込みを開始/停止するたびに記録したいと思います。

+0

'LinkedBlockingQueue' /' ArrayBlockingQueue'を使用すると何が問題になりますか? – pjp

+0

btraceは、プログラムの開始時にエージェントとして事前にコンパイルして添付することができます。 – VonC

+0

それは教育的な運動のためです。 – pypmannetjies

答えて

1

実行中のJavaプログラムの動的(バイトコード)計装クラスには、BTraceを使用する可能性があります。
BTraceは実行中のJavaプログラムのクラスにトレースアクションを挿入し、トレースされたプログラムクラスをホットスワップします。

// import all BTrace annotations 
import com.sun.btrace.annotations.*; 
// import statics from BTraceUtils class 
import static com.sun.btrace.BTraceUtils.*; 

// @BTrace annotation tells that this is a BTrace program 
@BTrace 
public class HelloWorld { 

    // @OnMethod annotation tells where to probe. 
    // In this example, we are interested in entry 
    // into the Thread.start() method. 
    @OnMethod(
     clazz="java.lang.Thread", 
     method="start" 
    ) 
    public static void func() { 
     // println is defined in BTraceUtils 
     // you can only call the static methods of BTraceUtils 
     println("about to start a thread!"); 
    } 
} 
+0

これはとても面白いです。しかし、それは独自のJavaプログラムとして実行する必要があり、btraceはコマンドラインから実行する必要があります...これはオプションではありません。 :( – pypmannetjies