CyclicBarrier
基本理念
构造方法
CyclicBarrier(int parties)
创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动 barrier 时执行预定义的操作。
CyclicBarrier(int parties, Runnable barrierAction)
创建一个新的 CyclicBarrier ,当给定数量的线程(线程)等待时,它将跳闸,当屏障跳闸时执行给定的屏障动作,由最后一个进入屏障的线程执行。
用法
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
System.out.println("最后执行的主线程");
});
for(int i=1;i<=7;i++ ){
final int temp=i;
new Thread(()->{
System.out.println("线程"+temp+"执行");
try {
cyclicBarrier.await();
System.out.println("线程"+temp+"在主线程执行完毕后执行");
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
线程1执行
线程4执行
线程3执行
线程2执行
线程7执行
线程6执行
线程5执行
最后执行的主线程
线程5在主线程执行完毕后执行
线程4在主线程执行完毕后执行
线程6在主线程执行完毕后执行
线程1在主线程执行完毕后执行
线程7在主线程执行完毕后执行
线程3在主线程执行完毕后执行
线程2在主线程执行完毕后执行
复用调用reset()
Barrier被破坏
https://juejin.im/entry/6844903487482904584
CountDownLatch和CyclicBarrier
- CountDownLatch是线程组之间的等待,即一个(或多个)线程等待N个线程完成某件事情之后再执行;而CyclicBarrier则是线程组内的等待,即每个线程相互等待,即N个线程都被拦截之后,然后依次执行。
- CountDownLatch是减计数方式,而CyclicBarrier是加计数方式。
- CountDownLatch计数为0无法重置,而CyclicBarrier计数达到初始值,则可以重置。
- CountDownLatch不可以复用,而CyclicBarrier可以复用。