HorseRace(CyclicBarriers--THJ4)

package com.yzq.threadex;

// Using CyclicBarriers.
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.*;

class Horse implements Runnable {
  private static int counter = 0;
  private final int id = counter++;
  private int strides = 0;
  private static Random rand = new Random(47);
  private static CyclicBarrier barrier;

  public Horse(CyclicBarrier b) {
    barrier = b;
  }

  public synchronized int getStrides() {
    return strides;
  }

  public void run() {
    try {
      while (!Thread.interrupted()) {
        synchronized (this) {
          strides += rand.nextInt(3); // Produces 0, 1 or 2
        }
        barrier.await();
      }
    } catch (InterruptedException e) {
      // A legitimate way to exit
    } catch (BrokenBarrierException e) {
      // This one we want to know about
      throw new RuntimeException(e);
    }
  }

  public String toString() {
    return "Horse " + id + " ";
  }

  public String tracks() {
    StringBuilder s = new StringBuilder();
    for (int i = 0; i < getStrides(); i++) s.append("*");
    s.append(id);
    return s.toString();
  }
}

public class HorseRace {
  static final int FINISH_LINE = 75;
  private List<Horse> horses = new ArrayList<Horse>();
  private ExecutorService exec = Executors.newCachedThreadPool();
  private CyclicBarrier barrier;

  public HorseRace(int nHorses, final int pause) {
    barrier =
        new CyclicBarrier(
            nHorses,
            new Runnable() {
              public void run() {
                StringBuilder s = new StringBuilder();
                for (int i = 0; i < FINISH_LINE; i++) s.append("="); // The fence on the racetrack
                System.out.println(s);
                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) {
                  System.out.println("barrier-action sleep interrupted");
                }
              }
            });
    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;
    if (args.length > 0) { // Optional argument
      int n = new Integer(args[0]);
      nHorses = n > 0 ? n : nHorses;
    }
    if (args.length > 1) { // Optional argument
      int p = new Integer(args[1]);
      pause = p > -1 ? p : pause;
    }
    new HorseRace(nHorses, pause);
  }
} /* (Execute to see output) */ // :~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值