[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