CyclicBarrier的用法

         CyclicBarrier,是一个同步辅助类,可以实现让一组线程互相等待,直到某一状态后(common barrier point公共屏障点)再全部同时执行(并发动作)。

         而且barrier在释放等待线程后可以重复使用,所以称为循环的barrier。

         CyclicBarrier支持可选的runnable命令,在一组线程的最后一个线程到达barrier后,会执行这个runnable命令一次。

public class CyclicBarrierDemo {
	public static void main(String[] args) {
		int N = 4;
		// 在CyclicBarrier()增加runnable参数后,从结果可以看出,当四个线程的最后一个线程都到达barrier状态后,会运行这个Runnable命令
		CyclicBarrier barrier = new CyclicBarrier(N, new Runnable() {
			@Override
			public void run() {
				System.out.println("当前线程" + Thread.currentThread().getName());
			}
		});
		for (int i = 0; i < N; i++) {
			new Writer(barrier).start();
		}
	}

	static class Writer extends Thread {
		private CyclicBarrier cyclicBarrier;

		public Writer(CyclicBarrier cyclicBarrier) {
			this.cyclicBarrier = cyclicBarrier;
		}

		public void run() {
			System.out.println("线程" + Thread.currentThread().getName()
					+ "正在写入数据...");
			try {
				Thread.sleep(5000);// 以睡眠来模拟写入数据操作
				System.out.println("线程" + Thread.currentThread().getName()
						+ "写入数据完毕,等待其他线程写入完毕");
				cyclicBarrier.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				e.printStackTrace();
			}
			// 待所有线程都执行完后,才继续执行此句
			System.out.println("所有线程写入完毕,继续处理其他任务...");
		}
	}
}

 

你可能感兴趣的:(Cyclicbarrier)