一、概述
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point),也可以称为 栅栏;与 CountDownLatch 类相似,但是它有一些特殊性让它成为更强大的类。
特点:栅栏用于等待其它线程,且会阻塞自己当前线程;
所有线程必须同时到达栅栏位置后,才能继续执行;
CyclicBarrier 类有一个整数初始值,此值表示将在同一点同步的线程数量。当其中一个线程到达确定点,它会调用await() 方法来等待其他线程。当线程调用这个方法,CyclicBarrier阻塞线程进入休眠直到其他线程到达。当最后一个线程调用CyclicBarrier 类的await() 方法,它唤醒所有等待的线程并继续执行它们的任务。
二、应用场景
需要所有的子任务都完成时,才执行主任务,这个时候就可以选择使用CyclicBarrier。
三、实现
eg1:赛跑时,等待所有人都准备好时,才起跑
import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;/** * 赛跑时,等待所有人都准备好时,才起跑 */public class Runner implements Runnable{ private CyclicBarrier cyclicBarrier; private String name; public Runner(CyclicBarrier cyclicBarrier, String name){ this.cyclicBarrier = cyclicBarrier; this.name = name; } public void run() { System.out.println(name + "准备好了..."); try { cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(name + "开跑..."); }}
import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class RunnerTest { private static int count = 3; public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(count); ExecutorService service = Executors.newFixedThreadPool(count); service.execute(new Runner(cyclicBarrier, "运动员-1")); service.execute(new Runner(cyclicBarrier, "运动员-2")); service.execute(new Runner(cyclicBarrier, "运动员-3")); service.shutdown(); }}