一:简介
(1):官方解释
- 说到简介那就非得拿他和countdownlatch()进行比较讨论了
- CountDownLatch是一个同步的辅助类,允许一个或多个线程,等待其他一组线程完成操作,再继续执行。
- CyclicBarrier是一个同步的辅助类,允许一组线程相互之间等待,达到一个共同点,再继续执行。
(2):通俗解释
a:CountDownLatch()
- 这个就好比一个倒计时锁,调用countdown()方法计数器减一,在计数器减为0之前,其他线程就被阻塞住。
- 场景: 我们在玩LOL英雄联盟时会出现十个人不同加载状态,但是最后一个人由于各种原因始终加载不了100%,于是游戏系统自动等待所有玩家的状态都准备好,才展现游戏画面。
b:CyclicBarrier()
- 这个就好比一扇 等到固定人数 才会开的门,这个里面每来个线程调用await()方法,那么固定人数减一 直到减为0的话,这扇门开了,所有线程执行,然后再锁上门,并把这个固定人数重置为初始值 等下一波人
二:小demo
public class TextCyclicBarrier {
public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
CyclicBarrier barrier = new CyclicBarrier(2);
ExecutorService service = Executors.newFixedThreadPool(2);
for (int i = 0; i < 2; i++) {
service.submit(()->{
System.out.println("task1....开始等待其他线程");
try {
barrier.await();
} catch (BrokenBarrierException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("task1...开始执行");
//模拟业务场景
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("task1...执行完毕");
});
service.submit(()->{
System.out.println("task2....开始等待其他线程");
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("task2...开始执行");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("task2...执行完毕");
});
}
service.shutdown();
}
}
这里我们用了for循环是模拟这个栅栏我们是可以重复使用的,就是我们可以重置我们的门口的固定人数。