CountDownLatch应用场景代码练习

目录

    • 概念原理
    • 核心参数和方法
    • 两种应用场景
    • 实现代码
      • 应用一:让 主任务 等待 所有子任务执行完毕后,再继续执行
      • 执行结果
      • 应用二:让所有子任务同时执行,打印出发时间
      • 执行结果
      • 应用二(扩展):让所有子任务同时执行,模拟百米冲刺
      • 执行结果

概念原理

  • CountDownLatchjuc(java.util.concurrent)包里的一个工具类,还有一起的CycliBarrierSemaphore
  • CountDownLatch这个类的作用是让 一个主线程 等待其他子线程执行完毕后再执行。
  • 通过一个计数器count来实现的,计数器的初始值是子线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。
  • 注意:CountDownLatch 是一次性的,不能 reset count 值

核心参数和方法

在这里插入图片描述

  • 一个核心参数
    • count,记录子线程的个数
  • 两个核心方法
    • countDown(),让 count-1
    • await(),主任务等待的位置

两种应用场景

  • 让 主任务 等待 所有子任务执行完毕后,再继续执行
  • 让所有子任务同时执行,打印开始时间
    • (扩展)模拟百米冲刺

实现代码

应用一:让 主任务 等待 所有子任务执行完毕后,再继续执行

import java.util.Random;
import java.util.concurrent.CountDownLatch;

public class CountDownLatchTest01 {

    public static void main(String[] args) throws InterruptedException {
        // 定义子任务的个数
        int count = 3;
        // 主任务 latch
        CountDownLatch latch = new CountDownLatch(count);
        // 主任务开始
        System.out.println("主任务开始...");

        Random random = new Random();
        // 三个子任务执行,执行完通知 主任务
        for (int i = 0; i < count; i++) {
            new Thread(() -> {
                // 子线程执行业务,使用随机数模拟执行时间长短
                try {
                    int num = random.nextInt(8);
                    Thread.sleep(num * 1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                // 子任务执行完毕
                System.out.println( "  " + Thread.currentThread().getName() + " 子线程执行任务完毕");
                // 执行完毕通知主任务
                latch.countDown();
            }).start();
        }

        // 主任务等待子任务全部执行完毕
        latch.await();

        // 主任务继续 业务
        System.out.println("全部子任务执行完毕,主任务继续...");
        Thread.sleep(3000);

        // 主任务执行完毕
        System.out.println("主任务执行完毕");
    }

}

执行结果

在这里插入图片描述

应用二:让所有子任务同时执行,打印出发时间

import java.util.Random;
import java.util.concurrent.CountDownLatch;

public class CountDownLatchTest02 {

    public static void main(String[] args) throws InterruptedException {
        // 定义子任务的个数
        int count = 3;

        // 开始信号 latch
        CountDownLatch latch = new CountDownLatch(1);

        for (int i = 0; i < count; i++) {
            new Thread(() -> {
                try {
                    // 等待开始信号
                    latch.await();

                    // 打印出发时间
                    System.out.println(Thread.currentThread().getName() + " 线程出发时间 " + System.currentTimeMillis());

                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }).start();
        }

        // 3 秒后开始
        System.out.println("3 秒后开始...");
        Thread.sleep(3000);
        latch.countDown();
    }

}

执行结果

在这里插入图片描述

应用二(扩展):让所有子任务同时执行,模拟百米冲刺

import java.util.Random;
import java.util.concurrent.CountDownLatch;
/**
 * 应用二:
 *      让所有子任务同时执行,模拟百米冲刺
 *          用一个共享 CountDownLatch(1) order 模拟发令枪,
 *          用一个共享 CountDownLatch(n) answer 模拟n个运动员,
 *          多个运动员在开始执行任务前首先 order.await() 集合,等待 order 1=>0 开始执行
 *
 */
public class CountDownLatchTest03 {

    public static void main(String[] args) throws InterruptedException {
        // 定义运动员的人数
        int count = 3;

        // 发令枪,当从 1 到 0,所有 运动员出发
        CountDownLatch order = new CountDownLatch(1);
        // 运动员
        CountDownLatch answer = new CountDownLatch(count);

        Random random = new Random();
        for (int i = 0; i < count; i++) {
            new Thread(() -> {
                try {
                    // 每个线程是一个运动员,等待 发令枪 从 1 到 0
                    order.await();

                    // 运动员出发
                    System.out.println("  " + Thread.currentThread().getName() + " 运动员出发...");

                    // 使用随机数模拟跑步用时时间长短
                    int num = random.nextInt(8);
                    Thread.sleep(num * 1000);
                    System.out.println( "  " + Thread.currentThread().getName() + " 运动员到达终点,用时 " + num + " s");

                    // 执行完毕到 终点 报道,统计成绩
                    answer.countDown();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }).start();
        }

        // 发布 口令
        System.out.printf("口令:预备 -> 跑\n");
        order.countDown();

        // 等待所有运动员到 终点
        answer.await();

        System.out.println("所有运动员已到终点");
    }

}

执行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/614672.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[沫忘录]MySQL 锁

[沫忘录]MySQL 锁 锁能够协调多线程或多进程并发访问某资源产生的数据冲突与错乱。而在数据库中&#xff0c;锁也是协调数据库访问的有效工具。 全局锁 能够锁住当前服务器所有数据库及其表。后续所有事务都只能进行读操作&#xff0c;而不能进行写操作或表属性更改。 典型…

C++入门系列-析构函数

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 析构函数 概念 析构函数&#xff0c;与构造函数功能相反&#xff0c;析构函数不是完成对对象本身的销毁&#xff0c;局部对象销毁工作是由编译器完成的&#xff0c;而对象在销…

即插即用篇 | YOLOv8 引入 Strip Pooling | 重新思考场景解析的空间池化

本改进已集成到 YOLOv8-Magic 框架。 空间池化已被证明在捕获像素级预测任务的长距离上下文信息方面非常有效,如场景解析。在本文中,我们超越了通常具有N N规则形状的常规空间池化,重新思考空间池化的构成,引入了一种新的池化策略,称为条带池化,它考虑了一个长而窄的核,…

【Linux】从零开始认识动静态库 -动态库

送给大家一句话&#xff1a; 我不要你风生虎啸&#xff0c; 我愿你老来无事饱加餐。 – 梁实秋 《我把活着欢喜过了》 ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭…

ES6-自学01

调用方法读取文件&#xff1a;如果失败就throw抛出err,成功则抛出data 2.使用promise封装&#xff0c;如果失败就改变状态为 reject(err) 如果成功就 resolve(返回成功的值) &#xff0c;然后then,就可以获取返回的值&#xff0c;值toString&#xff08;&#xff09;方法来把…

示例十一、声音传感器

通过以下几个示例来具体展开学习,了解声音传感器原理及特性&#xff0c;学习声音传感器的应用&#xff08;干货版&#xff09;&#xff1a; 示例十一、声音传感器 ino文件源码&#xff1a; //Arduino C demo void setup() {Serial.begin(9600);pinMode(5, OUTPUT); }void loo…

解决wangEditor使用keep-alive缓存后,调用editor.cmd.do()失败

前提&#xff1a;wangeditor版本&#xff1a;4.7.11 vue版本&#xff1a;vue2 问题&#xff1a;在使用wangeditor富文本编辑器时&#xff0c;需求需要通过点击一个按钮&#xff0c;手动插入定义好的内容&#xff0c;所以使用了 editor.cmd.do(insertHTML, ....) 方法新增…

steam_api64.dll是什么东西?steam_api64.dll缺失的多个详细解决方法

在现代PC游戏领域&#xff0c;Steam无疑是最具影响力的游戏分发和社交平台之一。它不仅提供了一个庞大的游戏市场&#xff0c;还集成了好友系统、成就系统、云存储等多种功能&#xff0c;为数百万玩家提供了便捷的游戏体验。在这庞大的生态系统中&#xff0c;steam_api64.dll作…

快递物流查询:如何实现快递批量查询?这些技巧助你轻松应对

在日常生活和工作中&#xff0c;我们经常需要查询快递物流信息&#xff0c;尤其是当面对大量的快递包裹时&#xff0c;逐一查询无疑会耗费大量的时间和精力。这时&#xff0c;实现快递批量查询就显得尤为重要。本文将为你介绍办公提效工具一些实现快递批量查询的技巧&#xff0…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (一)

基于LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; RAG 是未来人工智能应用的基石。大家并不是在寻求仅仅产生无意义反应的人工智能。而目标是人工智能能够从特定文档集中检索答案&#xff0c;理解查询的上下文&#xff0c;指导自己搜索其嵌入内容或…

嵌入式C语言高级教程:实现基于STM32的智能健康监测手环

智能健康监测手环能够实时监控用户的生理参数&#xff0c;如心率、体温和活动量&#xff0c;对于健康管理和疾病预防非常有帮助。本教程将指导您如何在STM32微控制器上实现一个基本的智能健康监测手环。 一、开发环境准备 硬件要求 微控制器&#xff1a;STM32L476RG&#xf…

软考常见排序

1.桶排序 将需要排序的数组内容全都取出来放在另一个有序的数组中,然后在依次放回(菜鸟网原图) 2.冒泡排序 数组最前面的元素与之后的每个元素依次比较,后面的元素比前面的元素大,就获取后面的元素然后继续与后面元素比较,直到所有元素都比较过一遍. 3.选择排序 从待排序的数据…

Java基础入门day48

day48 JDBC调用关系 tomcat 简介 tomcat是Apache下的一个核心项目&#xff0c;免费开源&#xff0c;支持servlet和jsp。 tomcat技术先进&#xff0c;性能稳定&#xff0c;目前比较流行的web应用服务器 安装 官网&#xff1a; Apache Tomcat - Welcome! 下载 tomcat8.5 解压&a…

JavaScript创建日期

创建日期 在JavaScript中创建日期有四种方法 ● 使用new Date() const now new Date(); console.log(now);● 直接输入月、日、年、时间 console.log(new Date(Aug 02 2024 18:05:41));● 也可以输入年月日 console.log(new Date(December 24, 2015));● 直接按照年、月、…

【人工智能】博弈搜索(极小极大值、α-β剪枝)

1. 极小极大值算法 人工智能中 “博弈” 通常专指博弈论专家们称为有完整信息的、确定性的、轮流行动的、两个游戏者的零和游戏&#xff08;如国际象棋)。术语中&#xff0c;这是指在确定的、完全可观察的环境中两个 Agent必须轮流行动&#xff0c;在游戏结束时效用值总是相等并…

一、精准化测试介绍

精准化测试介绍 一、精准化测试是什么&#xff1f;二、什么是代码插桩&#xff1f;三、两种插桩方式Offine模式&#xff1a;On-the-fly插桩: 四、jacoco覆盖率报告展示五、增量代码覆盖率监控原理六、精准测试系统架构图七、全量与增量覆盖率报告包维度对比八、全量与增量覆盖率…

芯品荟 | 酒柜屏控案例分享

产品简介 温控酒柜是一种专门设计用于存储和保护酒类的电器&#xff0c;它能为不同类型酒品提供最适宜的保存条件&#xff0c;以维持或提升酒的品质与风味。这类酒柜的主要特点是具备精准的温度控制功能&#xff0c;确保内部温度稳定在一个理想的范围内&#xff0c;通常为葡萄…

【DRAM存储器三十】DDR4介绍-DDR4 SDRAM的主要技术特性之bank group,为什么要搞个group出来?

👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 参考资料:《镁光DDR4数据手册》 、《JESD79-4B》 DDR4新增了bank group,大家想一想,为什么要增加这么个设定?其目的是什么? 如上是网上看到的一张从SDR到…

14:HAL---CRC校验

103系列只有一个CRC 前言&#xff1a; CRC&#xff08;Cyclic Redundancy Check&#xff09;&#xff0c;即循环冗余校验&#xff0c;是一种根据网络数据包或电脑文件等数据产生简短固定位数校核码的快速算法&#xff0c;主要用来检测或校核数据传输或者保存后可能出现的错误。…

数据库被攻击后出现1044 - access denied for user ‘root‘@‘% ‘ to database table

MySQL数据库被攻击后&#xff0c;数据库全部被删除&#xff0c;并且加一个一个勒索的数据&#xff0c;向我索要btc&#xff0c; 出现这个问题就是我的数据库密码太简单了&#xff0c;弱密码&#xff0c;被破解了&#xff0c;并且把我权限也给修改了 导致我操作数据库时&#…