文章目录
- 一:简介
- (1):官方解释
- (2):通俗解释
- a:CountDownLatch()
- b:CyclicBarrier()
- 二:小demo
一:简介
(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循环是模拟这个栅栏我们是可以重复使用的,就是我们可以重置我们的门口的固定人数。