CyclicBarrier

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (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毫秒
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值