一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
上个赛马的例子:
package thread;
import java.util.ArrayList;
import java.util.Date;
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;
public class HorseRace {
private static final int FINISH_LINE = 75;
private List<Horse> horses = new ArrayList<Horse>();
private ExecutorService exec = Executors.newCachedThreadPool();
private CyclicBarrier barrier;
private final int horseNum;
public HorseRace(int horseNum) {
this.horseNum = horseNum;
barrier = new CyclicBarrier(horseNum, new Runnable(
) {
@Override
public void run() {
System.out.println("所有马儿都跑到啦!来看看成绩: ");
exec.shutdownNow();
//所有马儿用时
for(Horse h : horses) {
System.out.println(h + " : " + h.runTime() +"毫秒");
}
}
});
init();
}
private void init() {
for(int i=0; i<horseNum; i++) {
Horse h = new Horse(barrier, FINISH_LINE);
horses.add(h);
exec.execute(h);
}
}
public static void main(String[] args) {
new HorseRace(5);
}
}
class Horse implements Runnable {
private static int counter = 0;
private static int order = 0;
private final int id = ++counter;
private static Random random = new Random(47);
private CyclicBarrier barrier;
private int step = 0;
private Date startTime;
private Date endTime;
private final int finishLine;
public Horse(CyclicBarrier barrier, int finishLine) {
this.barrier = barrier;
this.finishLine = finishLine;
}
@Override
public void run() {
startTime = new Date();
try {
while(!Thread.interrupted()) {
while(step < finishLine) {
step += random.nextInt(3);
TimeUnit.MILLISECONDS.sleep(random.nextInt(1000));
}
endTime = new Date();
System.out.println(this + " 跑完啦!第" + (++order) + "名哦!");
barrier.await();
}
}catch (InterruptedException e) {
System.out.println(this + " Interrupted ! ");
}catch (BrokenBarrierException e) {
System.out.println(this + " BrokenBarrier ! ");
}
}
public long runTime() {
return endTime.getTime() -startTime.getTime();
}
@Override
public String toString() {
return "Horse " + id;
}
}
//output
Horse 4 跑完啦!第1名哦!
Horse 2 跑完啦!第2名哦!
Horse 5 跑完啦!第3名哦!
Horse 1 跑完啦!第4名哦!
Horse 3 跑完啦!第5名哦!
所有马儿都跑到啦!来看看成绩:
Horse 1 : 47000毫秒
Horse 2 : 37131毫秒
Horse 3 : 48230毫秒
Horse 4 : 33204毫秒
Horse 5 : 41136毫秒