CyclicBarrier
跟CountDOwnLatch非常类似,也是计时结束执行。
区别就是可以重用,也就是基数可以回到初始值。用完了不需要重新创建对象。
谁调用await就阻塞谁,这个能阻塞多个,countdownlatch只能阻塞一个。
变为0之后 再次调用await 又会回到初始化的值
基本使用
CyclicBarrier:循环栅栏(屏障),用来进行线程协作,等待线程满足某个计数,才能触发自己执行
常用方法:
-
public CyclicBarrier(int parties, Runnable barrierAction)
:用于在线程到达屏障 parties 时,执行 barrierAction-
parties:代表多少个线程到达屏障开始触发线程任务
-
barrierAction:线程任务(基数为0的执行方法)
-
-
public int await()
:线程调用 await 方法通知 CyclicBarrier 本线程已经到达屏障【基数不为0不会向下进行】
与 CountDownLatch 的区别:CyclicBarrier 是可以重用的
应用:可以实现多线程中,某个任务在等待其他线程执行完毕以后触发
-
注意:线程数要和基数保持一致,否则可能时两个线task1完成。因为submit在for循环中。第二次循环线程池还有线程的话可以去竞争。
public static void main(String[] args) {ExecutorService service = Executors.newFixedThreadPool(2);CyclicBarrier barrier = new CyclicBarrier(2, () -> {System.out.println("task1 task2 finish...");});for (int i = 0; i < 3; i++) { /// 循环重用service.submit(() -> {System.out.println("task1 begin...");try {Thread.sleep(1000);barrier.await(); // 2 - 1 = 1} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}});service.submit(() -> {System.out.println("task2 begin...");try {Thread.sleep(2000);barrier.await(); // 1 - 1 = 0} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}});}service.shutdown();}