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

简介: 并发编程之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();
        }
    }
}


相关文章
|
域名解析 缓存 安全
Tomcat - 如何优化 Tomcat 配置(内存、并发、缓存)优化
Tomcat - 如何优化 Tomcat 配置(内存、并发、缓存)优化
1355 0
|
12月前
|
Java 索引
让星星⭐月亮告诉你,HashMap之往红黑树添加元素-putTreeVal方法源码解读
本文详细解析了Java `HashMap` 中 `putTreeVal` 方法的源码,该方法用于在红黑树中添加元素。当数组索引位置已存在红黑树类型的元素时,会调用此方法。具体步骤包括:从根节点开始遍历红黑树,找到合适位置插入新元素,调整节点指针,保持红黑树平衡,并确保根节点是链表头节点。通过源码解析,帮助读者深入理解 `HashMap` 的内部实现机制。
152 2
|
前端开发 容器
css动画效果(边框线条流动效果)
css动画效果(边框线条流动效果)
|
设计模式 缓存 安全
设计模式 - 创建型模式_ 单例模式 Singleton Pattern
设计模式 - 创建型模式_ 单例模式 Singleton Pattern
183 0
|
编译器 PHP 开发者
探索PHP 8的新特性及其对现代Web开发的影响
随着PHP 8的发布,这个广受欢迎的服务器端脚本语言迎来了一系列令人兴奋的新特性和性能改进。本文将深入探讨PHP 8中的一些关键更新,包括JIT编译器、联合类型、命名参数、匹配表达式等,并讨论这些变化如何影响现代Web开发的实践。我们将通过具体示例来揭示新特性的实际应用场景,同时分析它们可能给开发者带来的挑战与机遇。文章旨在为读者提供一份关于PHP 8新特性的实用指南,帮助他们更好地适应这一新版本的语言环境。
|
安全 大数据 API
elasticsearch|大数据|kibana的安装(https+密码)
elasticsearch|大数据|kibana的安装(https+密码)
588 0
|
安全 Java Spring
阿里云服务器的8080端口无法访问
阿里云服务器的8080端口无法访问
461 0
|
JavaScript 前端开发
【Vue版本 - 前端实践系列之九】登录注册界面千篇一律?教你做个炫酷的!
【Vue版本 - 前端实践系列之九】登录注册界面千篇一律?教你做个炫酷的!
|
弹性计算 Shell Windows
阿里云学生专享ecs服务器体验及个人配置
阿里云学生优惠专享的云服务器个人使用体验
阿里云学生专享ecs服务器体验及个人配置