CountDownLatch 使用详情

news2024/10/7 12:28:38

在这里插入图片描述
CountDownLatch 是 Java.util.concurrent 包下的一个类,它可以用来实现一个或多个线程等待其他线程完成后再继续执行的场景。

CountDownLatch 类中有一个计数器,每次调用 countDown() 方法计数器的值减1,当计数器的值变为0时,调用 await() 方法的线程就会被唤醒,继续执行。

CountDownLatch 的使用一般包括以下几个步骤:

  1. 创建一个 CountDownLatch 对象,并指定计数器的初始值。
  2. 在需要等待的线程中调用 await() 方法,进入等待状态。
  3. 在其他线程中完成任务后,调用 countDown() 方法,计数器的值减1。
  4. 当计数器的值变为0时,被等待的线程会被唤醒,继续执行。

下面是一个使用 CountDownLatch 的简单案例:

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        // 创建一个 CountDownLatch 对象,初始计数器的值为3
        CountDownLatch latch = new CountDownLatch(3);

        // 创建三个线程,每个线程执行任务后调用 countDown() 方法
        Thread thread1 = new Thread(new Task(latch, "Task 1"));
        Thread thread2 = new Thread(new Task(latch, "Task 2"));
        Thread thread3 = new Thread(new Task(latch, "Task 3"));

        // 启动三个线程
        thread1.start();
        thread2.start();
        thread3.start();

        // 主线程调用 await() 方法等待计数器变为0
        latch.await();

        // 当计数器变为0时,主线程继续执行
        System.out.println("All tasks have been completed.");
    }
}

class Task implements Runnable {
    private CountDownLatch latch;
    private String name;

    public Task(CountDownLatch latch, String name) {
        this.latch = latch;
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(name + " is running.");

        // 模拟任务执行时间
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(name + " is completed.");

        // 任务完成后调用 countDown() 方法
        latch.countDown();
    }
}

在上面的例子中,我们创建了一个 CountDownLatch 对象,计数器的初始值为3。然后创建了三个线程,每个线程执行任务后调用 countDown() 方法。在主线程中调用 await() 方法等待计数器的值变为0,当计数器的值变为0时,主线程继续执行并输出 “All tasks have been completed.”。每个线程的任务模拟了一个耗时的操作,当任务完成后调用 countDown() 方法,计数器的值减1。当计数器的值减到0时,主线程被唤醒,继续执行。

CountDownLatch 的使用场景包括:

  • 主线程等待多个子线程完成后再继续执行。
  • 多个子线程等待某个主线程发出信号后再同时执行。
  • 控制并发线程的执行顺序,比如先执行A线程,再执行B线程。

需要注意的是,CountDownLatch 的计数器一旦减到0后就不能再重新设置,如果需要多次使用可以考虑使用 CyclicBarrier 类。另外,CountDownLatch 是一次性的,一旦计数器的值变为0后,再次调用 await() 方法会直接通过,不会再等待。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面向大模型的存储加速方案设计和实践

这是 AI 大底座系列云智公开课的第三期内容。前两期我的两位同事已经向大家介绍了高性能网络和 GPU 容器虚拟化的相关内容。今天我们把目光聚焦在存储方向,一起来看看面向大模型的存储加速方案的设计和实践。 今天将从以下三个方面来展开这次分享: 介绍…

APP外包开发的Flutter框架

Flutter 是一种流行的开源UI框架,由谷歌开发,用于构建跨平台的移动应用程序。它使用一套统一的代码库,可以在多个平台上(如Android、iOS、Web、桌面等)保持一致的外观和行为。今天和大家分享一些基于 Flutter 开发的常…

CI/CD持续集成持续发布(jenkins)

1.背景 在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试; 或者前后端分离后,经常会修改接口,然后重新…

【CSS】说说响应式布局

目录 一、是什么 二、怎么实现 1、媒体查询 2、百分比 3、vw/vh 4、小结 三、总结 一、是什么 响应式设计简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。 响应式网站常见特点: 同时适配PC 平板 手机等…

代码随想录 - 数组

数组是存放在连续内存空间上的相同类型数据的集合。 注意: 数组下标都是从0开始的。数组内存空间的地址是连续的 数组的在内存空间的地址是连续的,所以在删除或者增添元素的时候,就难免要移动其他元素的地址。 例如删除下标为3的元素&#x…

SpringMVC的注解

文章目录 前言前期准备ResponseBody 返回JSONRequestMapping 映射控制器GetMapping、PostMapping 前言 提示:这里可以添加本文要记录的大概内容: SpringMVC框架只需要少量的配置即可快速实现Web应用程序开发,不需要大量的XML配置文件。 不…

【ES】笔记-简化对象写法箭头函数及声明特点

简化对象写法&箭头函数及声明特点 简化对象写法箭头函数及声明特点 简化对象写法 ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法.这样的书写更加简介 声明变量和和函数 let name南昌大学;let changefunction(){console.log(我可以改…

如何使用Kafka构建事件驱动的架构

事件驱动的架构(EDA)是一种软件设计模式,它关注事件的生成、检测和使用,以支持高效和可扩展的系统。在EDA中,事件是组件之间通信的主要手段,允许它们实时交互和响应更改。这种架构促进了松散耦合、可扩展性和响应性,使…

Semantic Kernel 入门系列:突破提示词的限制

无尽的上下文 LLM对自然语言的理解和掌握在知识内容的解读和总结方面提供了强大的能力。 但是由于训练数据本身来自于公共领域,也就注定了无法在一些小众或者私有的领域能够足够的好的应答。 因此如何给LLM 提供足够多的信息上下文,就是如今的LLM AI应…

el-table合并表头、动态合并列、合并尾部合计

在有些情况下,我们会有合并表头、合并列、合并尾部合计的需求,这篇文章是为了记录,如何进行合并,方便日后翻阅。 效果图 el-table合并表头 el-table合并列(动态合并) el-table合并尾部合计 el-table合并表…

64x8com的LCD液晶屏驱动芯片IC,VK1625完美兼容市面所有1625驱动芯片

产品型号:VK1625 产品品牌:VINKA/元泰 封装形式:QFP100 LQFP100 DICE/裸片 COB邦定片 定制COG 专业工程服务,技术支持!用芯服务! 概述: VK1625B是一个64x8的LCD駆动器. 可软件程控使其适用于多样化的…

在 Amazon SageMaker 上使用 Amazon Inferentia2 实现 AI 作画

在前一篇文章中,我们介绍了如何使用 Amazon EC2 Inf2 实例部署大语言模型,有不少用户询问 Amazon Inf2 实例是否支持当下流行的 AIGC 模型,答案是肯定的。同时,图片生成时间、QPS、服务器推理成本、如何在云中部署,也是…

【数学建模】--聚类模型

聚类模型的定义: “物以类聚,人以群分”,所谓的聚类,就是将样本划分为由类似的对象组成的多个类的过程。聚类后,我们可以更加准确的在每个类中单独使用统计模型进行估计,分析或预测;也可以探究不…

bigemap如何添加高清在线地图?

说明:批量添加可以同时添加多个在线地图,一次性添加完成(批量添加无法验证地址是否可以访问) 添加后如下图: 第一步 : 制作地图配置文件:选择添加在线地图(查看帮助)。 …

Linux6.33 Kubernetes kubectl详解

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes kubectl详解一、陈述式资源管理方法1.基本信息查看2.项目的生命周期:创建-->发布-->更新-->回滚-->删除 二、声明式管理方法 计算机系统 5G云计算 第三章 LINUX Kubernetes kubectl详解 一、陈述…

【力扣每日一题】2023.8.7 反转字符串

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个字符数组形式的字符串,让我们直接原地修改反转字符串,不必返回。 给出的条件是使用O(1)的额外空间…

JS进阶-Day3

🥔:永远做自己的聚光灯 JS进阶-Day1——点击此处(作用域、函数、解构赋值等) JS进阶-Day2——点击此处(深入对象之构造函数、实例成员、静态成员等;内置构造函数之引用类型、包装类型等) 更多JS…

工业以太网交换机-SCALANCE X200 环网组态

1.概述 SCALANCE X200 系列交换机自从2004年8月推入市场,当时交换机只能接入环网,不能做环网管理器。在各个工业现场得到了广泛的应用。2007年5月发布了X200系列新的硬件版本平台,普通交换机可以用HSR(高速冗余)方法做…

[虚幻引擎] UE DTBase64 插件说明 使用蓝图对字符串或文件进行Base64加密解密

本插件可以在虚幻引擎中使用蓝图对字符串,字节数组,文件进行Base64的加密和解密。 目录 1. 节点说明 String To Base64 Base64 To String Binary To Base64 Base64 To Binary File To Base64 Base64 To File 2. 案例演示 3. 插件下载 1. 节点说…

【用于全变分去噪的分裂布雷格曼方法】实施拆分布雷格曼方法进行总变异去噪研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…