Java多线程确保子线程执行完再执行-循环栅栏CyclicBarrier

CyclicBarrier介绍

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

CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),有最后一个线程执行。

对于失败的同步尝试,CyclicBarrier 使用了一种要么全部要么全不 (all-or-none) 的破坏模式:如果因为中断、失败或者超时等原因,导致线程过早地离开了屏障点,那么在该屏障点等待的其他所有线程也将通过 BrokenBarrierException(如果它们几乎同时被中断,则用 InterruptedException)以反常的方式离开。

例子

通过上面的介绍,可以通过生活中的列子加深对于此方法的使用场景:

礼拜天了,公司小王约了公司4个美女去郊游,总共5人,由小王开车,约好了上午7点在指定地点集合

约好了时间地点,如果人不全肯定需要等待,不能把没到的扔下离开,下面我们用程序来实现这个例子。

代码示例

public class Test {
	public static void main(String[] args) {
		String[] person = new String[] {"小王","1号","2号","3号","4号"};
		final CyclicBarrier barrier = new CyclicBarrier(5, new Runnable() {
			@Override
			public void run() {
				System.out.println("人都到齐了,出发去郊游……");
			}
		});
		for(int i=0;i<5;i++) {
			new Outing(person[i],barrier).start();
			try {
				TimeUnit.MILLISECONDS.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
}

class Outing extends Thread {
	String name;
	CyclicBarrier barrier;
	public Outing(String name,CyclicBarrier barrier) {
		this.name = name;
		this.barrier = barrier;
	}
	public void run() {
		System.out.println(name+"到了");
		try {
			barrier.await();//线程到了屏障了,例子中就是人上车了,如果还有没到的就要等待 
		} catch (InterruptedException | BrokenBarrierException e) {
			e.printStackTrace();
		}
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦里藍天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值