并发编程之CountDownLatch和CyclicBarrier的详细解析(带小案例)

CountDownLatch

倒计时锁存器 用来解决线程执行次序的问题

  • CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。

  • 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),

  • 当计数器的值变为o时,因await方法阻塞的线程会被唤醒,继续执行。

下面例子中,主线程‘班长’需要等子线程全部执行完成再执行,但是出现了如下情况:

运行结果:

代码:

public class CountDownLatchDemo {
    public static void main(String[] args) {
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                System.out.println("离开了教室");
            },i+"").start();
        }
​
        System.out.println("班长关门走人");
    }
}

解决方法:使用CountDownLatch

运行结果:

代码:

public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                System.out.println("离开了教室");
                countDownLatch.countDown();
            },i+"").start();
        }
        countDownLatch.await();
        System.out.println("班长关门走人");
​
    }
}

CyclicBarrier

---------------------(循环屏障)

和上面的CountDownLatch(做减法倒计时开始任务)不同,CyclicBarrier是做加法来开始任务的

运行结果:

代码:

public class CyclicBarrierDemo {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, ()->{
            System.out.println("召唤神龙");
        });
​
        for (int i = 0; i < 7; i++) {
            int temp = i;
            new Thread(()->{
                try {
                    System.out.println("集齐第"+temp+"颗龙珠");
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },i+"").start();
        }
    }
}

相关推荐

  1. Go语言并发编程:GoroutinesChannels详细指南

    2024-03-30 10:46:01       46 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-30 10:46:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-30 10:46:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-30 10:46:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-30 10:46:01       20 阅读

热门阅读

  1. K8S Pod 水平自动扩缩容 HPA

    2024-03-30 10:46:01       17 阅读
  2. 进程调度的基本过程

    2024-03-30 10:46:01       17 阅读
  3. 跨站脚本攻击(XSS)测试

    2024-03-30 10:46:01       17 阅读
  4. 面试知识汇总——垃圾回收器(G1垃圾回收器)

    2024-03-30 10:46:01       16 阅读
  5. springMVC

    springMVC

    2024-03-30 10:46:01      18 阅读
  6. Redission快速入门

    2024-03-30 10:46:01       16 阅读
  7. 001-从零学习设计模式-设计原则

    2024-03-30 10:46:01       18 阅读
  8. Redis的数据类型List使用场景实战

    2024-03-30 10:46:01       17 阅读
  9. 如何使用 RabbitMQ 进行消息的发送和接收

    2024-03-30 10:46:01       19 阅读
  10. 查验身份证

    2024-03-30 10:46:01       16 阅读
  11. 如何使用 WebView 将 React Native 嵌入到原生应用中

    2024-03-30 10:46:01       20 阅读
  12. HTTPS

    HTTPS

    2024-03-30 10:46:01      18 阅读
  13. 当构造器参数较多时考虑用生成器

    2024-03-30 10:46:01       18 阅读
  14. 复习拓扑排序

    2024-03-30 10:46:01       21 阅读
  15. Redis 过期删除策略

    2024-03-30 10:46:01       17 阅读