并发类编程—CyclicBarrier(循环屏蔽)
CyclicBarrier:循环屏蔽,CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行,可以重复使用,当计数变为定义数值后再次调用await()又会开始新的一轮计数。
代码实现:
public class Test { public static void main(String[] args) { CyclicBarrier barrier = new CyclicBarrier(7, () -> System.out.println("所以人进入教室")); for (int a = 1; a <= 7; a++) { final int temp = a; new Thread(() -> { System.out.println("第" + temp + "位到达"); try { barrier.await(); // await可以设置超时时间,当超过等待时候后,则回抛出异常,然后结束等待 // barrier.await(1,TimeUnit.SECONDS); System.out.println("第" + temp + "已准备好上课!"); } catch (Exception e) { e.printStackTrace(); } } ).start(); } }}
效果:
CountDownLatch与CyclicBarrier对比区别:
CountDownLatch使某个线程需要等待其他线程结束后才运行,CyclicBarrier使所有线程等待然后同时运行。