CyclicBarrier实现赛马游戏
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 stries = 0;
private static Random random = new Random(47);
private static CyclicBarrier barrier;
public Horse(CyclicBarrier cyclicBarrier) {
barrier = cyclicBarrier;
}
public synchronized int getStries(){
return this.stries;
}
@Override
public void run() {
while (!Thread.interrupted()){
synchronized (this){
stries += random.nextInt(3);
}
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
@Override
public String toString() {
return "horse "+id+" ";
}
public String tracks(){
StringBuilder s = new StringBuilder();
for (int i=0 ; i<getStries() ; i++){
s.append("*");
}
s.append(id);
return s.toString();
}
}
public class HorseRace {
static final int FINISH_LINE = 75;
private List<Horse> horseList = new ArrayList<Horse>();
//创建线程池
private ExecutorService exec = Executors.newCachedThreadPool();
//栅栏
private CyclicBarrier barrier;
public HorseRace(int nHorse,final int pause) {
barrier = new CyclicBarrier(nHorse, new Runnable() {
@Override
public void run() {
StringBuilder s = new StringBuilder();
for (int i=0 ; i<FINISH_LINE ; i++){
s.append("=");
}
System.out.println(s.toString());
for (Horse h:horseList){
System.out.println(h.toString()+h.tracks());
}
for (Horse h:horseList){
if (h.getStries()>=FINISH_LINE){
System.out.println("winner is"+h.toString());
exec.shutdownNow();
return;
}
}
try {
TimeUnit.MILLISECONDS.sleep(pause);
} catch (InterruptedException e) {
System.out.println("barrier-action sleep interrupted");
}
}
});
for (int i=0 ; i<nHorse ; i++){
Horse horse = new Horse(barrier);
horseList.add(horse);
exec.execute(horse);
}
}
public static void main(String[] args) {
int nHorse = 7;
int pause = 200;
if (args.length >0){
int n = new Integer(args[0]);
nHorse = n > 0 ? n : nHorse;
}
if (args.length > 1){
int p = new Integer(args[1]);
pause = p > -1 ? p : pause;
}
new HorseRace(nHorse,pause);
}
}