使用情况:你希望创建一组任务,他们并行执行,然后再进行下一个步骤之前等待,直到所有任务都完成
下面是一个赛马的例子,挺有意思的(java编程思想)
import java.util.concurrent.*;
import java.util.*;
public 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 barrier){
this.barrier=barrier;
}
public synchronized int getStrides(){
return strides;
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
while(!Thread.interrupted()){
synchronized(this){
strides+=rand.nextInt(3);
}
barrier.await();
}
}
catch(InterruptedException e){}
catch(BrokenBarrierException e){
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();
}
}
import java.util.concurrent.*;
import java.util.*;
public class HorseRace {
public 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("=");
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);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int nHorses=7;
int pause=200;
new HorseRace(nHorses,pause);
}
}