package mypack;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
class Horse implements Runnable{
private static int counter=0;
private int id=counter++;
private int strides=0;
private CyclicBarrier barrier;
private static Random random=new Random(47);
public Horse(CyclicBarrier b){
barrier=b;
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
while(!Thread.interrupted()){
strides += random.nextInt(5);
barrier.await();
}
}catch(InterruptedException | BrokenBarrierException e){
System.out.println("interupt");
}
}
public int getStribes(){
return strides;
}
public String tracks(){
StringBuilder builder = new StringBuilder();
for(int i=0;i<getStribes();i++)
builder.append("*");
builder.append(id);
return builder.toString();
}
public String toString() {
return "Horse "+id+" ";
}
}
public class HorseRace {
static final int FINISH_LINE=75;
List<Horse> horses=new ArrayList<Horse>();
ExecutorService exec=Executors.newCachedThreadPool();
private CyclicBarrier barrier;
public HorseRace(int nHorse,int pause){
barrier=new CyclicBarrier(nHorse, new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
StringBuilder builder=new StringBuilder();
for(int i=0;i<FINISH_LINE;i++)
builder.append("=");
System.out.print(builder);
System.out.println();
for(Horse h :horses)
System.out.println(h.tracks());
for(Horse h : horses){
if(h.getStribes()>=FINISH_LINE){
System.out.println(h+ "Won");
exec.shutdownNow();
return;
}
}
try {
TimeUnit.MILLISECONDS.sleep(pause);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
for(int i=0;i<nHorse;i++){
Horse horse = new Horse(barrier);
horses.add(horse);
exec.execute(horse);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int nhorse=7;
int pause=200;
new HorseRace(nhorse, pause);
}
}