允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。
它的作用就是会让所有线程都等待完成后才会继续下一步行动。

public CyclicBarrier(int parties, Runnable barrierAction)

parties :是参与线程的个数
Runnable 参数,这个参数的意思是最后一个到达线程要做的任务

重要的方法:

public int await() throws InterruptedException, BrokenBarrierException
public int await(long timeout, TimeUnit unit)

线程调用 await() 表示自己已经到达栅栏

简单示例

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class Test05 {
    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;//加final的原因
           new Thread(()->{
               System.out.println(Thread.currentThread().getName()+"收集了第"+temp+"课龙珠");
               try {
                   cyclicBarrier.await();//等待计数器变为7,如果计数器为8,则程序无法结束
               } catch (InterruptedException e) {
                   e.printStackTrace();
               } catch (BrokenBarrierException e) {
                   e.printStackTrace();
               }
           }).start();
        }
    }
}