javaプログラミング思想ノート-合併のCyclicBarrier
CyclicBarrierとCountDownLatchは同じように、タスクのセットを並列に動作させ、次のステップまで待つことができます。すべてのタスクが完了するまでは、CountDownLatchはイベントをトリガするだけです。CyclicBarrierは何度も再利用できます。
例:競馬ゲーム
例:競馬ゲーム
class Horse implements Runnable{
private static int counter=0;
// id
private final int id=counter++;
//
private int strides=0;
private static Random random=new Random(47);
//
private static CyclicBarrier barrier;
public Horse(CyclicBarrier b){
barrier=b;
}
public synchronized int getStrides() {
return strides;
}
@Override
public void run() {
try {
while (!Thread.interrupted()) {
synchronized (this) {
strides+=random.nextInt(3);
}
barrier.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public String toString() {
return "House "+id+" ";
}
public String tracks(){
StringBuilder sb=new StringBuilder();
for (int i = 0; i "*");
}
sb.append(id);
return sb.toString();
}
}
public class HouseRace {
static final int FINISH_LINE=75;
private Listhorses=new ArrayList();
private ExecutorService exec=Executors.newCachedThreadPool();
private CyclicBarrier barrier;
public HouseRace(int nHorses,final int pause){
barrier=new CyclicBarrier(nHorses, new Runnable() {
@Override
public void run() {
StringBuilder sb=new StringBuilder();
for (int i = 0; i < FINISH_LINE; i++) {
sb.append("=");
}
System.out.println(sb);
for (Horse horse : horses) {
System.out.println(horse.tracks());
}
for (Horse horse : horses) {
if (horse.getStrides()>=FINISH_LINE) {
System.out.println(horse+" won ");
exec.shutdownNow();
return ;
}
}
try {
TimeUnit.MILLISECONDS.sleep(pause);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
for (int i = 0; i < nHorses; i++) {
Horse horse=new Horse(barrier);
horses.add(horse);
exec.execute(horse);
}
}
public static void main(String[] args) {
int nHorses=7;
int pause=200;
new HouseRace(nHorses, pause);
}
}
すべての競馬スレッドは、走るたびに掛けられています。すべての競走馬がフェンスのところで待っている間に、フェンスを呼び出してbarriarActionを行います。