java并发API:CyclicBarrier跑步比赛--一起跑

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

  CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。 

public class CyclicBarrierTest {
	private final int RUNNER_COUNT = 10;
	Runnable runnable = new Runnable() {
		@Override
		public void run() {
			System.out.println("人到齐了,开跑....");
		}
	};
	final CyclicBarrier barrier = new CyclicBarrier(RUNNER_COUNT, runnable);
	public void goHome() throws InterruptedException, BrokenBarrierException {
		System.out.println(Thread.currentThread().getName() + "预备....");
		barrier.await();
		System.out.println(Thread.currentThread().getName() + "跑到终点....");
	}
	public static void main(String[] args) throws InterruptedException,
			BrokenBarrierException {
		final CyclicBarrierTest instance = new CyclicBarrierTest();
		/**
		 * 每个线程代表一个Runner
		 */
		for (int i = 0; i < instance.RUNNER_COUNT; i++) {
			new Thread("Runner" + i + "  ") {
				public void run() {
					try {
						instance.goHome();
					} catch (InterruptedException e) {
						e.printStackTrace();
					} catch (BrokenBarrierException e) {
						e.printStackTrace();
					}
				};
			}.start();
		}
	}
}
结果:

Runner0  预备....
Runner3  预备....
Runner2  预备....
Runner1  预备....
Runner5  预备....
Runner4  预备....
Runner6  预备....
Runner8  预备....
Runner7  预备....
Runner9  预备....
人到齐了,开跑....
Runner9  跑到终点....
Runner0  跑到终点....
Runner1  跑到终点....
Runner7  跑到终点....
Runner8  跑到终点....
Runner6  跑到终点....
Runner4  跑到终点....
Runner5  跑到终点....
Runner2  跑到终点....
Runner3  跑到终点....


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值