概念

cyclicBarrier的字面意思时可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法

例子

收集七龙珠,只有七颗龙珠收齐了才能召唤神龙,没得到七颗之前,其他得到的龙珠只能先放好,等到七颗收起完成才能一起召唤

代码实现

  • new CyclicBarrier();第一个参数(即7)表示等待的线程数,第二个参数(即()->{System.out.println("****集齐龙珠,召唤神龙****");})是达到7个后执行的方法,即构造方法有一个 Runnable 参数,这个参数的意思是最后一个到达线程要做的任务
  • 线程调用 await() 表示自己已经到达栅栏
  • BrokenBarrierException 表示栅栏已经被破坏,破坏的原因可能是其中一个线程 await() 时被中断或者超时
  1. package com.bowen;
  2. import java.util.concurrent.BrokenBarrierException;
  3. import java.util.concurrent.CyclicBarrier;
  4. public class CyclicBarrierDemo {
  5. public static void main(String[] args) {
  6. CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
  7. System.out.println("****集齐龙珠,召唤神龙****");
  8. });
  9. for (int i = 1; i <= 7; i++) {
  10. final int temp = i;
  11. new Thread(()->{
  12. System.out.println("集到第"+temp+"颗龙珠");
  13. try {
  14. cyclicBarrier.await();
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. } catch (BrokenBarrierException e) {
  18. e.printStackTrace();
  19. }
  20. },String.valueOf(i)).start();
  21. }
  22. }
  23. }
  24. //结果
  25. //集到第6颗龙珠
  26. //集到第2颗龙珠
  27. //集到第3颗龙珠
  28. //集到第5颗龙珠
  29. //集到第7颗龙珠
  30. //集到第1颗龙珠
  31. //集到第4颗龙珠
  32. //****集齐龙珠,召唤神龙****