这个是它的一个有参构造,第一个参数是次数,第二个参数是线程任务即咱们的主任务, 可以理解为,当障碍器被通知parties次时,开始线程barrierActionji
代码实现为
/** * 主任务 * @author zx */ public class MainTask implements Runnable{ private String name; public MainTask(String name) { this.name = name; } @Override public void run() { System.out.println("主任务 ["+name+"] Start"); } } 子任务 /** * 子任务 * @author zx */ public class SubTask implements Runnable{ private String name; private CyclicBarrier cyclicBarrier; public SubTask(String name,CyclicBarrier cyclicBarrier) { this.name = name; this.cyclicBarrier = cyclicBarrier; } @Override public void run() { System.out.println("子任务["+name+"]start"); for (int i = 0; i < 999; i++);//模拟耗时任务、 System.out.println("子任务["+name+"]执行完毕,通知障碍器已经完成"); try { //通知障碍器已经完成 cyclicBarrier.await(); } catch (Exception e) { e.printStackTrace(); } } } /** * java线程 特性--障碍器O * @author zx * */ public class TestMainTask extends Thread{ public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new MainTask("C")); new Thread(new SubTask("A", cyclicBarrier)).start(); new Thread(new SubTask("B", cyclicBarrier)).start(); } } 运行结果为 子任务[A]start 子任务[B]start 子任务[B]执行完毕,通知障碍器已经完成 子任务[A]执行完毕,通知障碍器已经完成 主任务 [C] Start当然,我们要明白它的使用场景,只有在主任务 明确知道 子任务 准确次数通知的情况下,才适用