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使所有线程等待然后同时运行。