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

相关推荐
阿伟*rui1 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
XiaoLeisj3 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck3 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei3 小时前
java的类加载机制的学习
java·学习
Yaml45 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~5 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616885 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7896 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java6 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~6 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust