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


相关文章
|
SQL 关系型数据库 MySQL
将MySQL 数据迁移到 PostgreSQL
将MySQL 数据迁移到 PostgreSQL 可以采用以下步骤: 安装 PostgreSQL 数据库:首先,需要安装 PostgreSQL 数据库。可以从官方网站(https://www.postgresql.org/)下载最新版本的 PostgreSQL,并根据官方指南进行安装。 创建 PostgreSQL 数据库:在 PostgreSQL 中创建与 MySQL 数据库相对应的数据库。可以使用 pgAdmin 或命令行工具(如 psql)来创建数据库。例如,如果在 MySQL 中有一个名为 &quot;mydb&quot; 的数据库,那么可以在 PostgreSQL 中创建一个具有相同名称的数据库。 导
5026 0
|
存储 监控 算法
深入探究Java线程池:提升并发性能的利器
在当今高度并发的应用开发中,Java线程池作为一种广泛应用的并发编程技术,提供了一种优雅且高效的线程管理方案。本文深入探究Java线程池的相关技术,涵盖其核心概念、优势、常见类型(如FixedThreadPool、CachedThreadPool、SingleThreadExecutor、ScheduledThreadPool、ForkJoinPool及WorkStealingPool)、核心参数配置、异常处理与监控方法,以及性能调优的最佳实践,帮助读者更好地理解和应用线程池,从而提升并发性能。
186 2
IDEA 查看接口或类的继承实现关系图
IDEA 查看接口或类的继承实现关系图
502 0
IDEA 一个窗口打开多个项目ideal中如何添加几个不同的项目在同一个idea页面显示
IDEA 一个窗口打开多个项目ideal中如何添加几个不同的项目在同一个idea页面显示
IDEA 一个窗口打开多个项目ideal中如何添加几个不同的项目在同一个idea页面显示
|
存储 缓存 Java
Java - ArrayList 中 elementData 为什么被 transient 修饰?
Java - ArrayList 中 elementData 为什么被 transient 修饰?
330 0
|
存储 缓存 Java
【小家Spring】详解Spring AOP的底层代理JdkDynamicAopProxy和ObjenesisCglibAopProxy的源码分析(介绍CGLIB使用中的坑)(中)
【小家Spring】详解Spring AOP的底层代理JdkDynamicAopProxy和ObjenesisCglibAopProxy的源码分析(介绍CGLIB使用中的坑)(中)
|
Java 数据库连接 Spring
【小家Spring】Spring容器加载Bean定义信息的两员大将:AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner(下)
【小家Spring】Spring容器加载Bean定义信息的两员大将:AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner(下)