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 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
电商API_180079052471 小时前
电商商品价格监控工具淘宝京东商品价格抓取API项目实操分享
java·大数据·开发语言·前端·数据挖掘
zzzll11111 小时前
深度剖析:HashMap 并发死循环与 ConcurrentHashMap 两代演进全解
java·开发语言
秋名RG1 小时前
2026/5/27 生产事故复盘与整改方案
java
血小板要健康2 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
坐吃山猪2 小时前
【多线程】CompletableFuture使用
java·开发语言·多线程
m0_587383002 小时前
点餐预约核销系统的架构脉络
java·架构·系统架构·需求分析
代码方舟2 小时前
O2O二手车交易平台B端车商管理后台:基于天远车信盟出险构建自动化车况评估网关
java·运维·人工智能·自动化
爱学堂IT分享3 小时前
图灵Java互联网架构师六期
java·开发语言
坐吃山猪3 小时前
【多线程】Semaphore使用
java·数据库·oracle·多线程