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方法,计数就会回到最开始的值,重新执行。

相关推荐
文丑颜不良啊1 小时前
LeetCode2081~2100题目解析
java·leetcode
玖米GEO运营王总监1 小时前
2026年账号矩阵协同效应怎么量化:三个指标与公式结构
java·大数据·数据库
叼烟扛炮2 小时前
[LangChain] 学习笔记(03):打破失忆症——对话机制与上下文管理
java·前端·javascript·笔记·学习·langchain
文丑颜不良啊3 小时前
LeetCode2061~2080题目解析
java·leetcode
特立独行的猫A3 小时前
13MB 单文件、一条命令变服务:把仓颉写的 cjh 内嵌进你的应用,当它的 AI 大脑
java·后端·python
Brookty3 小时前
Java博客项目实战|工程环境与构建:工程目录、PowerShell命令调用与JDK/IDEA/Maven工作机制
java·项目实战
养军博客4 小时前
Spring Boot 3.x + Spring Security 6.x 整合 JWT 实战:jjwt 与 java-jwt 两种工具库详解
java·spring boot·springsecurity
TeamDev4 小时前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
J.YA4 小时前
String字符串[面试题]
java·开发语言
金銀銅鐵14 小时前
为什么枚举类中可以定义抽象方法
java·后端·ai编程