[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends-ml 1692] Rendezvous クラス
こんばんは。武川です。
前回の読書会でRendezvousクラスというクラスが出てきましたが、
このクラスが3つ以上のスレッドでどのように値を交換するのか
よくわからなかったので、サンプルプログラムを作って確認
してみました。
new Randezvous(n);で初期化したとすると、
Randezvous.randezvousメソッドをn個のスレッドが呼ぶまで、
各スレッドはこのメソッド内でwaitしつづけます。
#タイムアウトする場合もあるが、ここでは無視。
n個目のスレッドがRandezvous.randezvousを呼んだときに、
1番目のスレッドの値と自分の値を交換し、notifyallを呼びます。
そして、以降他のスレッドが次々実行され、i(<=n)番目の
スレッドが(i+1)%1番目のスレッドの値をもらいます。
で、全てのスレッドが値を交換することができる。
面白いのは交換のポリシーがインターフェースで
定義されているので、独自のポリシーを出来るところでしょうか?
#デフォルトではローテーションです。
以下サンプルプログラムです。
----ここから----
import EDU.oswego.cs.dl.util.concurrent.Rendezvous;
import EDU.oswego.cs.dl.util.concurrent.BrokenBarrierException;
class RendevousTest implements Runnable {
  static int num = 3;
  static Rendezvous exchanger = new Rendezvous(num);
  int count = 0;
  public RendevousTest(int c){
    count = c;
  }
  public void run() {
    String name = Integer.toString(count);
    String val = null; 
    try {
      val = (String)(exchanger.rendezvous(name));
      System.out.println("thread " + name + " got " + val );
    }
    catch (BrokenBarrierException ex) {
      return;
    }
    catch (InterruptedException ex) {
      Thread.currentThread().interrupt();
    }
  }
  public static void main(String args[]) {
    if(args > 0){
      try{
        num = Integer.parseInt(args[0]);
      }catch(Exception e){};
    }
    for(int i=0;i<num;i++){
      new Thread(new RendevousTest(i)).start();
    }
  }
}
----ここまで----
ではでは。
----
武川 努 takekawa@xxxxxxxxxxxxxx