并发编程回顾:循环阻断器CyclicBarrier

原先多线程并发编程的学习笔记和代码整理一下贴上来。

---------------------------------

循环阻断器CyclicBarrier

CyclicBarrier(循环栅栏):没有找到合适的名字,这里自己翻译成循环阻断器。

感觉这个工具类其实和CountDownLatch很像,不同的是CountDownLatch是等待一组其它线程,CyclicBarrier是一组线程相互等待。而且CountDownLatch是通过计数停止等待(计数为0时,才会继续执行),而CyclicBarrier是在所有线程都调用了await()后才会继续执行的。

根据JDK文档中描述:

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。因为该barrier在释放等待线程后可以重用,所以称它为循环的barrier

下面是一个跑步比赛的例子。

所有选手先上跑道,热身,准备好后,才开始比赛。所有选手都到达终点后,比赛才结束。

首先定义一个选手类:

class Player implements Runnable{
	private String playerName;
	private CyclicBarrier begin;
	private CyclicBarrier end;
	public Player(String playerName,CyclicBarrier begin,CyclicBarrier end){
		super();
		this.begin=begin;
		this.end=end;
		this.playerName=playerName;
	}
	@Override
	public void run() {
		try {
			System.out.println("参赛者"+playerName+"上跑道...");
			System.out.println("参赛者"+playerName+"热身...");
			System.out.println("参赛者"+playerName+"准备完毕!");
			begin.await();
			int time=new Random().nextInt(15)+5;
			Thread.sleep(time*1000);
			System.out.println("参赛者"+playerName+"到达终点!用时:"+time+"s");
			end.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			e.printStackTrace();
		}
	}
}

定义了两个阻断器,一个用于开始比赛,一个用于结束比赛。

比赛全程实况转播大笑

CyclicBarrier begin = new CyclicBarrier(N,new Runnable() {
	@Override
	public void run() {
		System.out.println("砰!比赛开始!");
	}
});
CyclicBarrier end = new CyclicBarrier(N,new Runnable() {
	@Override
	public void run() {
		System.out.println("全场比赛结束!");
	}
});
ExecutorService es = Executors.newFixedThreadPool(N);
for(int i=0;i<N;i++){
	es.execute(new Player(String.valueOf(i+1), begin, end));
}

注意这里定义的阻断器,首先指明全部参与者数量N,然后指定当启动barrier时执行给定的屏障操作,该操作由最后一个进入barrier的线程执行。

最后,看一下比赛录像:

参赛者1上跑道...
参赛者1热身...
参赛者4上跑道...
参赛者4热身...
参赛者4准备完毕!
参赛者2上跑道...
参赛者2热身...
参赛者2准备完毕!
参赛者3上跑道...
参赛者3热身...
参赛者3准备完毕!
参赛者1准备完毕!
砰!比赛开始!
参赛者4到达终点!用时:8s
参赛者2到达终点!用时:10s
参赛者3到达终点!用时:14s
参赛者1到达终点!用时:18s
全场比赛结束!

你可能感兴趣的:(Cyclicbarrier)