从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏障。
    它的作用就是会让所有线程都等待完成后才会继续下一步行动。
    举个例子,就像生活中我们会约朋友们到某个餐厅一起吃饭,有些朋友可能会早到,有些朋友可能会晚到,但是这个餐厅规定必须等到所有人到齐之后才会让我们进去。这里的朋友们就是各个线程,餐厅就是 CyclicBarrier。


    线程调用 await() 表示自己已经到达栅栏
    BrokenBarrierException 表示栅栏已经被破坏,破坏的原因可能是其中一个线程 await() 时被中断或者超时

    1. public class CyclicBarrierDemo {
    2. static class TaskThread extends Thread {
    3. CyclicBarrier barrier;
    4. public TaskThread(CyclicBarrier barrier) {
    5. this.barrier = barrier;
    6. }
    7. @Override
    8. public void run() {
    9. try {
    10. Thread.sleep(1000);
    11. System.out.println(getName() + " 到达栅栏 A");
    12. barrier.await();
    13. System.out.println(getName() + " 冲破栅栏 A");
    14. Thread.sleep(2000);
    15. System.out.println(getName() + " 到达栅栏 B");
    16. barrier.await();
    17. System.out.println(getName() + " 冲破栅栏 B");
    18. } catch (Exception e) {
    19. e.printStackTrace();
    20. }
    21. }
    22. }
    23. public static void main(String[] args) {
    24. int threadNum = 5;
    25. CyclicBarrier barrier = new CyclicBarrier(threadNum, new Runnable() {
    26. @Override
    27. public void run() {
    28. System.out.println(Thread.currentThread().getName() + " 完成最后任务");
    29. }
    30. });
    31. for(int i = 0; i < threadNum; i++) {
    32. new TaskThread(barrier).start();
    33. }
    34. }
    35. }

    参考:https://www.jianshu.com/p/333fd8faa56e