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();
		}
	}
}

你可能感兴趣的:(java,java,多线程,并发编程,thread)