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

news2024/9/20 2:21:05

文章目录

    • 同步工具类
    • 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.coloradmin.cn/o/2123838.html

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

相关文章

【kafka】kafka如何保证数据的可靠性,kafka如何保证数据不丢失

1. Kafka架构&#xff1a; Producer - Broker - Consumer 回到问题上来&#xff0c;Kafka如何保证数据不丢失&#xff0c;我们先看看Kafka如何保证Producer端数据不丢失&#xff1a; 通过ack机制 最小副本数设置 生产者重试机制 2. Kafka Producer消息发送ACK机制&#xff1…

量化交易backtrader实践(一)_数据获取篇(2)_tushare与akshare

上一节回顾 在上一节中&#xff0c;从股票的基本功能和主要数据进行小结&#xff0c;明确了进行backtrader回测所需要的数据&#xff0c;并且学习了backtrader的数据来源以及PandasData的格式要求&#xff0c;已经做到假设拿到.txt或.csv文件后&#xff0c;能把里面的股票基本…

【代码随想录】字符串

本博文为《代码随想录》学习笔记&#xff0c;原文链接&#xff1a;代码随想录 344.反转字符串 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的…

Qt使用绿色pdf阅读器打开文件

1.下载SumatraPDF 2.设置 3.代码 void MainWindow::on_pushButton_clicked() {QProcess *process new QProcess();QString filePath "C:\\Users\\jude\\Desktop\\su\\11.pdf";QString sumatraPath "C:\\Users\\jude\\Desktop\\su\\SumatraPDF-3.5.2-64.exe&q…

Android 系统级应用守护进程

import java.util.Random; /** Application class for SystemUI. -42,6 69,8 public class SystemUIApplication extends Application { private static final String TAG “SystemUIService”; private static final boolean DEBUG false; private Context mContext;/*…

嵌入式产品发货后出现问题,怎么办?

目录 1、问题识别与初步诊断 2、影响评估 3、提出临时解决方案 4、根本原因分析与修复 5、修复验证与回归测试 6、修复的部署与客户沟通 7、预防未来类似问题 当嵌入式电子产品已发货且出现问题时&#xff0c;及时采取有效的补救措施是至关重要的。补救步骤应包括问题的…

javascript柯里化

return a b c d; } //通常调用方式 var sum add(1, 2, 3, 4); //柯里化的调用方式 var curryAdd Curry(add); var sum curryAdd(1)(2)(3)(4); //或者很多奇怪的方式调用 var sum curryAdd(1, 2)(3, 4); var sum curryAdd(1, 2, 3)(4); var sum curryAdd(1)(…

C语言 | Leetcode C语言题解之第398题随机数索引

题目&#xff1a; 题解&#xff1a; typedef struct {int *nums;int numsSize; } Solution;Solution* solutionCreate(int* nums, int numsSize) {Solution *obj (Solution *)malloc(sizeof(Solution));obj->nums nums;obj->numsSize numsSize;return obj; }int solu…

Maven之坑setting.xml配置

先来看遇到的问题 在运行 mvn clean package 打包命令的时候&#xff0c;IDEA控制台提示如下 Non-resolvable parent POM for com.xxxxx.xxxxx:1.0.0: The following artifacts could not be resolved: com.xxxxx:xxxxx:pom:1.0.0 (present, but unavailable): xxxxx:xxxxx…

全球热门剪辑软件大搜罗

如果你要为你的视频进行配音那肯定离不开音频剪辑软件&#xff0c;现在有不少音频剪辑软件免费版本就可以实现我们并不复杂的音频剪辑操作。这次我就给你分享几款能提高剪辑效率的音频剪辑工具。 1.福晰音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ …

Java面试篇基础部分-Java各种垃圾收集器

导语   在之前的分享中,我们知道Java堆内存被分为新生代和老年代两个部分;其中,新生代中主要存储生命周期较短的对象,了解了新生代中的对象采用的是复制算法进行垃圾回收;而老年代主要存储生命周期较长的对象以及大对象,采用的是标记整理算法进行垃圾回收。 针对不同的…

Es6解构赋值,熟练掌握作用域

5.3 数组的解构赋值 数组的解构赋值是按照前后数据的索引值一一对应的 5.4 前后数据结构也要保持一致,不然解构的可能与原数组解构嵌套不同 5.5 数组解构时的默认值 6 对象的解构赋值 对象的解构赋值是按照key一一解构 7 解构数组,如果有两个值必须写在后面,rest参数 8 解…

VMware账户授权迁移Broadcom账户-操作指南

前言: VMware被Broadcom收购后,大量的国内VMware企业用户获取技术支持的渠道改变。 特别是授权以及开Case的问题。 这篇文章保姆级教学,从你怎么拨打外国电话(并且告诉你背诵英文短语的方式从400处获取答案,不用交流),怎么获取Site ID,以及如何…

湖仓一体-Paimon篇-简介

简介 Apache Paimon 是一种数据湖的格式&#xff0c;支持使用 Flink 和 Spark 构建实时湖仓架构&#xff0c;用于流式和批处理操作。Paimon 创新性地结合了数据湖格式和LSM结构&#xff0c;将实时流式更新引入数据湖架构。 Paimon 提供以下核心功能&#xff1a; ● 实时更新&a…

游戏开发引擎___unity位置信息和unlit shader(无光照着色器)的使用,以桌子的渲染为例

unity是左手坐标系 1.位置信息 1.1 代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class positionTest : MonoBehaviour {public Camera Camera;private void OnGUI(){//世界坐标系&#xff0c;GUI里的标签GUI.Label(new Rec…

【智能流体力学】机器学习 (ML) 增强计算流体动力学 (CFD) 的最新进展

这篇综述探讨了通过机器学习 &#xff08;ML&#xff09; 增强计算流体动力学 &#xff08;CFD&#xff09; 的最新进展。文献系统地分为三个主要类别&#xff1a;数据驱动的代理、物理知情的代理和 ML 辅助数值解。随后&#xff0c;我们重点介绍了 ML for CFD 在关键科学和工程…

【开发工具】IntelliJ IDEA插件推荐:Json Helper——让JSON处理更高效

导语&#xff1a;在Java开发过程中&#xff0c;JSON作为一种轻量级的数据交换格式&#xff0c;被广泛应用于前后端数据交互。今天&#xff0c;我要为大家介绍一款IntelliJ IDEA插件——Json Helper&#xff0c;帮助开发者更高效地处理JSON数据。 一、什么是Json Helper&#x…

部署定时任务每2天清理一次表

1、创建存储过程 create or replace procedure truct authid current_user ---使用“authid Current_user”将存储过程转化为调用者权限 as begin execute immediate truncate table rep.tmp_s_st_busi_send_arc; end; / 2、创建定时任务 begin dbms_scheduler.create…

Java 内存分析及三种初始化

1&#xff0e;Java内存分析&#xff1a; &#xff08;1&#xff09;堆&#xff1a;①存放new的对象和数组&#xff1b;②可以被所有的线程共享&#xff0c;不会存放别的对象引用。 &#xff08;2&#xff09;栈&#xff1a;①存放基本变量类型&#xff08;包括这个基本类型的…

【网络安全】-xss跨站脚本攻击实战-xss-labs(1~10)

Level1: 检查页面源代码&#xff1a; function函数&#xff1a; (function(){try{let tn ;if(tn.includes(oem)){Object.defineProperty(document, referrer, {get: function(){return ;}});}else if(tn.includes(hao_pg)){if(!document.referrer.match(tn)){Object.definePro…