Java 入门指南:Java 并发编程 —— 同步工具类 CountDownLatch(倒计时门闩)

文章目录

    • 同步工具类
    • CountDownLatch
      • 常用方法
      • 使用步骤
      • 适用场景
      • 使用示例

同步工具类

JUC(Java.util.concurrent)是 Java 提供的用于并发编程的工具类库,其中包含了一些通信工具类,用于在多个线程之间进行协调和通信,特别是在多线程和网络通信方面。这些工具类提供了丰富的功能,帮助开发者高效地实现复杂的并发控制和网络通信需求。

![[JUC Communication Utilities.png]]

CountDownLatch

CountDownLatch(倒计时门闩)是 Java 中的一种同步辅助类,用于控制多个线程之间的协调,允许一个或多个线程等待其他线程完成一组操作

CountDownLatch 通过维护一个计数器来实现,计数器初始值可以设定为一个正整数(通常为需要等待的线程数量或任务数量)。每当一个线程完成任务后,计数器的值就会减1。当计数器的值减到 0 时,所有等待的线程都会被释放,此时所有因调用 await() 方法而阻塞的线程都会被唤醒,继续执行后续的操作。

常用方法

CountDownLatch 提供了几个关键的方法来实现其功能:

  • CountDownLatch(int count):构造函数,用于创建 CountDownLatch 实例,并设置计数器的初始值。

  • void countDown():递减计数器的值。每当一个线程完成任务后,可以调用此方法将计数器的值减1。

  • void await():使当前线程在计数器减至 0 之前一直等待。如果线程在等待过程中被中断,则会抛出 InterruptedException 异常。

  • boolean await(long timeout, TimeUnit unit):使当前线程在计数器减至 0 之前等待指定的时间。如果在等待时间内计数器减至 0,则返回 true;如果等待时间超时而计数器仍未减至 0,则返回 false。在等待过程中,如果线程被中断,则会抛出 InterruptedException 异常。

  • long getCount():获取当前计数器的值。这个方法主要用于调试或测试目的。

使用步骤

使用 CountDownLatch 的基本步骤如下:

  1. 创建一个 CountDownLatch 对象,并指定计数器的初始值。

  2. 在需要等待的线程中,调用 countDown() 方法来减少计数器的值。

  3. 在等待其他线程的线程中,调用 await() 方法,等待计数器的值减到0。

当计数器的值减到 0 时,所有等待的线程会被唤醒,可以继续执行后续操作。

需要注意的是,CountDownLatch一次性的,一旦计数器的值减到 0,就不能重置。如果需要可重复使用的类似功能,可以考虑使用其他同步工具类如 CyclicBarrierPhaser

CountDownLatch 在多线程协调和同步的场景中非常有用,可以有效地控制线程的执行顺序和状态的正确性。

适用场景

CountDownLatch 的使用场景是一个或多个线程需要等待其他线程完成某个操作后,再继续执行下去。它常用于以下情况:

  1. 并行计算的启动屏障:在并行计算中,可能需要等待所有并行任务都准备好后再开始执行。此时,可以将 CountDownLatch 的初始值设置为并行任务的数量,每个任务在开始执行前都调用 countDown() 方法,而主线程则调用 await() 方法等待所有任务都准备就绪。

  2. 等待多个线程完成:当有多个线程正在执行,并且需要等待所有这些线程都完成后再继续执行其他操作时,可以使用 CountDownLatch。通过将计数器的初始值设置为线程的数量,并在每个线程执行完毕后调用 countDown() 方法,主线程可以调用 await() 方法等待所有线程完成。

  3. 并发测试:在进行并发测试时,可能需要模拟多个线程同时触发某个操作。此时,可以使用 CountDownLatch 来等待所有线程都准备好后再一起触发操作。

使用示例

以下是一个简单的示例代码,演示了如何使用 CountDownLatch 来等待多个线程完成:

import java.util.concurrent.CountDownLatch;  public class CountDownLatchExample {  public static void main(String[] args) throws InterruptedException {  int numberOfThreads = 5;  CountDownLatch latch = new CountDownLatch(numberOfThreads);  for (int i = 0; i < numberOfThreads; i++) {  final int threadNum = i;  new Thread(() -> {  try {  // 模拟任务执行  Thread.sleep(1000);  System.out.println("Thread " + threadNum + " is done.");  } catch (InterruptedException e) {  Thread.currentThread().interrupt();  } finally {  latch.countDown();  }  }).start();  }  // 等待所有线程完成  latch.await();  System.out.println("All threads have completed.");  }  
}

在这个示例中,我们创建了一个包含5个线程的线程池(尽管这里直接使用了 Thread 类来创建线程,但原理相同),每个线程都执行一个模拟任务(通过 Thread.sleep(1000) 实现)。每个线程在完成任务后都会调用 latch.countDown() 来减少计数器的值。主线程调用 latch.await() 等待,直到计数器的值减到 0,即所有线程都完成了任务。然后,主线程继续执行并打印出所有线程都已完成的消息。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp媒体

uni.previewImage实现图片放大预览 // 图片预览函数function onPreview(index) {// 收集所有图片的urlvar urls pets.value.data.map(item > item.url)// 预览图片uni.previewImage({current: index, // 当前预览的图片索引urls: urls // 所有图片的url数组})}

大模型api谁家更便宜

1 openai 可点此链接查询价格&#xff1a;https://openai.com/api/pricing/ 2 百度 可点此链接查询价格&#xff1a;https://console.bce.baidu.com/qianfan/chargemanage/list 需要注意&#xff0c;百度千帆平台上还提供其他家的模型调用服务&#xff0c; 如llama, yi-34b等…

秋招突击——算法练习——9/4——73-矩阵置零、54-螺旋矩阵、48-旋转图像、240-搜索二维矩阵II

文章目录 引言复习新作73-矩阵置零个人实现 54-螺旋矩阵个人实现参考实现 48-旋转图像个人实现参考实现 240-搜索二维矩阵II个人实现参考实现 总结 引言 秋招开展的不是很顺利&#xff0c;还是要继续准备&#xff0c;继续刷算法&#xff01;不断完善自己&#xff0c;希望能够找…

yolov5 +gui界面+单目测距 实现对图片视频摄像头的测距

可实现对图片&#xff0c;视频&#xff0c;摄像头的检测 项目概述 本项目旨在实现一个集成了YOLOv5目标检测算法、图形用户界面&#xff08;GUI&#xff09;以及单目测距功能的系统。该系统能够对图片、视频或实时摄像头输入进行目标检测&#xff0c;并估算目标的距离。通过…

揭开Facebook AI的神秘面纱:如何利用人工智能提升社交体验

人工智能&#xff08;AI&#xff09;正迅速成为推动技术进步的核心力量&#xff0c;而Facebook作为全球领先的社交媒体平台&#xff0c;正通过AI技术不断提升用户体验和平台功能。本文将深入探讨Facebook如何利用AI技术&#xff0c;优化社交互动、内容推荐和用户管理&#xff0…

Sentinel 使用案例详细教程

文章目录 一、Sentinel 使用1.1 Sentinel 客户端1.2 Sentinel 控制台1.3 客户端和控制台的通信所需依赖 二、测试 Sentinel 限流规则2.1 启动配置2.2 定义限流资源2.3 配置流量控制规则2.4 运行项目 三、 测试 Sentinel 熔断降级规则3.1 定义资源3.2 配置熔断降级规则3.3 运行项…

info_scan!自动化漏洞扫描系统,附下载链接

在我们团队的日常工作中&#xff0c;定期进行安全演练和漏洞扫描几乎是必不可少的。每次安全互动我们都需要对关键资产进行全面的安全评估&#xff0c;及时发现可能存在的安全隐患。 就在上周&#xff0c;我们针对几个主要服务进行了例行的漏洞扫描。在这个过程中&#xff0c;…

DevOps平台搭建过程详解--Gitlab+Jenkins+Docker+Harbor+K8s集群搭建CICD平台

一、环境说明 1.1CI/CD CI即为持续集成(Continue Integration,简称CI)&#xff0c;用通俗的话讲&#xff0c;就是持续的整合版本库代码编译后制作应用镜像。建立有效的持续集成环境可以减少开发过程中一些不必要的问题、提高代码质量、快速迭代等;(Jenkins) CD即持续交付Con…

合宙低功耗4G模组Air780EX——硬件设计手册01

Air780EX是一款基于移芯EC618平台设计的LTECat1无线通信模组。支持FDD-LTE/TDD-LTE的4G远距离无线 传输技术。另外&#xff0c;模组提供了USB/UART/I2C等通用接口满足IoT行业的各种应用诉求。 一、主要性能 1.1 模块功能框图 1.2 模块型号列表 1.3 模块主要性能 *注: 模组…

Leetcode 最大子数组和

使用“Kadane’s Algorithm”来解决。 Kadane’s Algorithm 在每个步骤中都保持着一个局部最优解&#xff0c;即以当前元素为结尾的最大子数组和(也就是局部最优解)&#xff0c;并通过比较这些局部最优解和当前的全局最优解来找到最终的全局最优解。 Kadane’s Algorithm的核…

巧用工具,Vue 集成 medium-zoom 实现图片缩放

文章目录 巧用工具&#xff0c;Vue 集成 medium-zoom 实现图片缩放介绍medium-zoomVue3集成 medium-zoom 示例Vue2集成 medium-zoom 示例进阶 - 可选参数 巧用工具&#xff0c;Vue 集成 medium-zoom 实现图片缩放 在现代网页开发中&#xff0c;为用户提供良好的视觉体验至关重…

K-Means聚类

聚类的作用&#xff1a; 知识发现 发现事物之间的潜在关系 异常值检测 特征提取 数据压缩的例子 有监督和无监督学习&#xff1a; 有监督&#xff1a; 给定训练集 X 和 标签Y 选择模型 学习&#xff08;目标函数的最优化&#xff09; 生成模型&#xff08;本质上是一组参…

RocketMQ异步报错:No route info of this topic

在SpringBoot中发送RocketMQ异步消息的时候报错了&#xff0c;提示org.apache.rocketmq.client.exception.MQClientException: No route info of this topic, testTopic1 这里给出具体的解决方案 一、Broker模块不支持自动创建topic&#xff0c;并且topic没有被手动创建过 R…

OpenCV 与 YoloV3的结合使用:目标实时跟踪

目录 代码分析 1. YOLO 模型加载 2. 视频加载与初始化 3. 视频帧处理 4. 物体检测 5. 处理检测结果 6. 边界框和类别显示 7. 帧率&#xff08;FPS&#xff09;计算 8. 结果显示与退出 9. 资源释放 整体代码 效果展示 总结 代码分析 这段代码使用 YOLO&#xff08…

Linxu系统:kill命令

1、命令详解&#xff1a; kill命令是用于向进程发送信号&#xff0c;通常用来终止某个指定PID服务进程&#xff0c;kill命令可以发送不同的信号给目标进程&#xff0c;来实现不同的操作&#xff0c;如果不指定信号&#xff0c;默认会发送 TERM 信号&#xff08;15&#xff09;&…

ubuntu 和windows用samba服务器实现数据传输

1&#xff0c;linux安装samba服务器 sudo apt-get install samba samba-common 2&#xff0c;linux 配置权限&#xff0c;修改目录权限&#xff0c;linux下共享的文件权限设置。 sudo chmod 777 /home/lark -R 3. 添加samba用户 sudo smbpasswd -a lark 4&#xff0c;配置共享…

小程序页面整体执行顺序

首先执行 App.onLaunch -> App.onShow其次执行 Component.created -> Component.attached再执行 Page.onLoad -> Page.onShow最后 执行 Component.ready -> Page.onReady 你不知道的小程序系列之生命周期执行顺序

828华为云征文 | Flexus X实例与Harbor私有镜像仓库的完美结合

需要了解 本文章主要讲述在 华为云Flexus X 实例上搭建自己的企业级私有镜像仓库 Harbor&#xff0c;一键部署、搭建高可用安全可靠的容器镜像仓库选择合适的云服务器&#xff1a; 本文采用的是 华为云服务器 Flexus X 实例&#xff08;推荐使用&#xff09;连接方式&#xff1…

ctfshow-PHP特性

web89 <?php include("flag.php"); highlight_file(_FILE_);if(isset($_GET[num])){$num$_GET[num];if(preg_match("/[0-9]/",$num)){die("no no no"); #结束脚本呢执行输出指定信息}if(intval($num)){#把参数转换整数类型echo $flag;} } pr…

用面向对象的方法进行数据分析

项目从两个不同类型的文件&#xff08;文本文件和 JSON 文件&#xff09;读取销售数据&#xff0c;将其封装为 Record 对象&#xff0c;合并数据后&#xff0c;统计每天的销售总额&#xff0c;并通过 pyecharts 库生成一个包含每日销售额的柱状图&#xff08;Bar chart&#xf…