JUC并发工具类-------CountDownLatch、Cyclicbarrier

CountDownLatch简介

Countdownlatch倒计时锁,用于线程间同步协作,让一个线程等待其他所有线程完成后在执行

CountDownLatch简单使用举例

主线程等待线程1,2,3完成之后再执行:

java 复制代码
public class Testcountdownlatch {
    public static void main(String[] args) throws InterruptedException {
        //创建CountDownLatch
        CountDownLatch countDownLatch = new CountDownLatch(3);
        System.out.println("主线程正在等待三个线程干活........");

        new Thread(()->{
            System.out.println("线程1开始干活...");
            try {
                sleep(1000);
            } catch (InterruptedException e) { e.printStackTrace();}
            System.out.println("线程1结束干活");
            //完成任务,倒计时减一
            countDownLatch.countDown();
        }).start();

        new Thread(()->{
            System.out.println("线程2开始干活...");
            try {
                sleep(2000);
            } catch (InterruptedException e) { e.printStackTrace();}
            System.out.println("线程2结束干活");
            //完成任务,倒计时减一
            countDownLatch.countDown();
        }).start();

        new Thread(()->{
            System.out.println("线程3开始干活...");
            try {
                sleep(3000);
            } catch (InterruptedException e) { e.printStackTrace();}
            System.out.println("线程3结束干活");
            //完成任务,倒计时减一
            countDownLatch.countDown();
        }).start();
        //主线程等待
        countDownLatch.await();
        System.out.println("主线程最终结束");
    }
}

结合线程池使用:

java 复制代码
public class countdownlatch {
    public static void main(String[] args) {
        //创建CountDownLatch
        CountDownLatch countDownLatch = new CountDownLatch(3);
        //创建线程池
        ExecutorService service = Executors.newFixedThreadPool(4);
        //主线程
        service.submit(()->{
            System.out.println("主线程开始等待......");
            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("所有线程执行结束,主线程开始后续工作");
            try {
                sleep(2000);
            } catch (InterruptedException e) { e.printStackTrace();}
            System.out.println("工作:学习CountDownLatch很难吗?");
            System.out.println("主线程也结束工作");
        });

        service.submit(()->{
            System.out.println("线程1开始干活...");
            try {
                sleep(1000);
            } catch (InterruptedException e) { e.printStackTrace();}
            System.out.println("线程1结束干活");
            countDownLatch.countDown();
        });

        service.submit(()->{
            System.out.println("线程2开始干活...");
            try {
                sleep(2000);
            } catch (InterruptedException e) { e.printStackTrace();}
            System.out.println("线程2结束干活");
            countDownLatch.countDown();
        });

        service.submit(()->{
            System.out.println("线程3开始干活...");
            try {
                sleep(3000);
            } catch (InterruptedException e) { e.printStackTrace();}
            System.out.println("线程3结束干活");
            countDownLatch.countDown();
        });
        //关闭线程池资源
        service.shutdown();
    }
}

CountDownLatch模拟王者荣耀加载流程

java 复制代码
public class TimiLoad {
    public static void main(String[] args) throws InterruptedException {
        //创建线程池模拟玩家和游戏
        ExecutorService service = Executors.newFixedThreadPool(7);
        //创建6个玩家
        CountDownLatch countDownLatch = new CountDownLatch(6);
        //进度加载
        String[] all = new String[6];
        //游戏开始加载,主线程
        service.submit(()->{
        sleep(5000);
        countDownLatch.await();
        System.out.println("全部加载完成,准备进入战斗.....");
        });

        //召唤师
        for (int i = 1; i <= 6; i++) {
            int k=i;
            service.submit(()->{
                for (int j = 0; j <= 100; j++) {
                    Thread.sleep(50);
                    all[k-1] = "召唤师"+k+":"+j+"%";
                    System.out.print("\r" + Arrays.toString(all));
                }
                countDownLatch.countDown();
            });
        }

        service.shutdown();
    }
}

Cyclicbarrier简介

Cyclicbarrier是另外一种多线程并发控制工具,和CountDownLatch非常类似,它也可以实现线程间的计数等待,但它的功能比 CountDownLatch 更加复杂且强大。CyclicBarrier 可以理解为循环栅栏。只是比CountdownLatch多了一个循环使用的功能,即任务数等于0之后,再次调用await方法,计数就会回到最开始的值,重新执行。

相关推荐
MrZhangBaby5 分钟前
SQL-leetcode—1158. 市场分析 I
java·sql·leetcode
一只淡水鱼6619 分钟前
【spring原理】Bean的作用域与生命周期
java·spring boot·spring原理
五味香25 分钟前
Java学习,查找List最大最小值
android·java·开发语言·python·学习·golang·kotlin
jerry-8939 分钟前
Centos类型服务器等保测评整/etc/pam.d/system-auth
java·前端·github
Jerry Lau40 分钟前
大模型-本地化部署调用--基于ollama+openWebUI+springBoot
java·spring boot·后端·llama
小白的一叶扁舟43 分钟前
Kafka 入门与应用实战:吞吐量优化与与 RabbitMQ、RocketMQ 的对比
java·spring boot·kafka·rabbitmq·rocketmq
幼儿园老大*1 小时前
【系统架构】如何设计一个秒杀系统?
java·经验分享·后端·微服务·系统架构
言之。1 小时前
【Java】面试中遇到的两个排序
java·面试·排序算法
计算机-秋大田1 小时前
基于SSM的家庭记账本小程序设计与实现(LW+源码+讲解)
java·前端·后端·微信小程序·小程序·课程设计
南宫生1 小时前
力扣动态规划-7【算法学习day.101】
java·数据结构·算法·leetcode·动态规划