[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