Java并发基础:CountDownLatch全面解析!

news2024/9/24 9:26:54

Java并发基础:CountDownLatch全面解析! - 程序员古德

内容概要

CountDownLatch的优点在于能够简洁高效地协调多个线程的执行顺序,确保一组线程都完成后才触发其他线程的执行,适用于资源加载、任务初始化等场景。它提供了清晰的等待/通知机制,易于理解和使用,是提升多线程程序性能和可靠性的重要工具。

核心概念

CountDownLatchjava.util.concurrent 中的一个类,主要用来解决多线程之间的协同工作问题,特别是当一个或多个线程需要等待其他线程完成一系列操作后才能继续执行的情况。

CountDownLatch允许一个或多个线程等待其他一组线程完成操作,它使用一个计数器来初始化需要等待的线程数量,每当一个线程完成了它的任务,计数器就会递减,当计数器归零时,意味着所有需要等待的线程都已经完成了它们的任务,此时等待的线程(通常是一个或多个主线程)就可以继续执行了。

使用CountDownLatch可以更精确地控制线程的执行顺序和时机,例如,在一个多阶段的任务中,可能希望所有的数据预处理线程都完成后,再启动一个线程来进行数据汇总,使用CountDownLatch 可以很容易地实现这种需求。

代码案例

下面是一个简单的代码示例,演示了如何使用CountDownLatch,如下代码:

import java.util.concurrent.CountDownLatch;  
  
public class CountDownLatchExample {  
  
    // 定义一个包含3个计数的CountDownLatch  
    private static final int WORKER_THREADS = 3;  
    private static final CountDownLatch latch = new CountDownLatch(WORKER_THREADS);  
  
    public static void main(String[] args) throws InterruptedException {  
        // 创建并启动工作线程  
        for (int i = 0; i < WORKER_THREADS; i++) {  
            new Thread(() -> {  
                System.out.println("工作线程" + Thread.currentThread().getId() + "正在执行任务...");  
                try {  
                    // 模拟任务执行时间  
                    Thread.sleep((long) (Math.random() * 1000));  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
                System.out.println("工作线程" + Thread.currentThread().getId() + "任务执行完毕!");  
                // 当前工作线程完成任务后,CountDownLatch计数减1  
                latch.countDown();  
            }).start();  
        }  
  
        // 主线程在此等待,直到所有工作线程都完成任务  
        latch.await();  
        System.out.println("所有工作线程都已完成任务,主线程继续执行...");  
    }  
}

在这段代码中,定义了一个CountDownLatch实例latch,并初始化其计数为工作线程的数量(在这个例子中是3),在main方法中,创建了3个工作线程,并启动它们,每个工作线程都执行一个任务,任务完成后调用latch.countDown()方法将CountDownLatch的计数减1,主线程调用latch.await()方法等待,直到CountDownLatch的计数减为0(即所有工作线程都完成了任务)才会继续执行,当所有工作线程都完成任务后,主线程会打印出一条消息表示它可以继续执行了。

如下代码执行结果:

工作线程11正在执行任务...  
工作线程12正在执行任务...  
工作线程13正在执行任务...  
工作线程12任务执行完毕!  
工作线程11任务执行完毕!  
工作线程13任务执行完毕!  
所有工作线程都已完成任务,主线程继续执行...

核心API

CountDownLatch 类主要提供了以下几个核心方法:

  1. CountDownLatch(int count),构造函数,用来初始化一个倒计时计数器,设置初始计数值,参数 count 表示需要等待的事件数量。
  2. void await(),使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或发生了其他不可预料的事情,如果当前计数为零,则此方法立即返回,如果当前计数大于零,则为了使线程能够继续执行,当前线程必须禁用中断,并且锁存器计数必须减至零,或者此线程必须被其他线程中断。
  3. boolean await(long timeout, TimeUnit unit),使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断、超出了指定的等待时间,或者发生了其他不可预料的事情,如果当前计数为零,则此方法立即返回 true 值,如果当前计数大于零,则此方法将一直阻塞,直到以下三种情况之一发生:
    1. 锁存器计数减至零;此时方法返回 true
    2. 其他线程中断了当前线程;此时方法抛出 InterruptedException
    3. 已超出了指定的等待时间;此时方法返回 false
  4. void countDown(),递减锁存器的计数,如果计数到达零,则释放所有等待的线程,如果当前计数大于零,则将计数减少,如果新的计数为零,出于线程调度的目的,将释放所有等待的线程。
  5. long getCount(),返回当前计数,此方法通常用于调试和测试,而不是用于同步控制,因为它可能与其他操作竞态。

其中await()countDown() 是最常用的,await() 方法用于阻塞当前线程,直到计数器减至零;countDown() 方法用于将计数器减一,这两个方法通常在不同的线程中调用,以实现线程间的协调。

核心总结

Java并发基础:CountDownLatch全面解析!- 程序员古德

CountDownLatch是Java并发编程中的一把利器,它简洁易用,能有效协调多个线程的执行顺序,优点在于,它能确保一组线程都完成后,再触发其他线程的执行,这在很多场景下都非常有用,比如资源加载、任务初始化等,但同时,它也有一些局限性,比如无法重置计数,一旦计数到零,就不能再次使用了。而且,它只能等待固定数量的线程,不够灵活。

关注我,每天学习互联网编程技术 - 程序员古德

END!

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

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

相关文章

ChatGPT prompt概述

ChatGPT prompt概述 2022年11月30日&#xff0c;由人工智能实验室Open AI发布的对话式大型语言模型ChatGPT一夜爆火。凭借其强大的文字处理和人机交互能力迅速成为炙手可热的新一代人工智能产品。ChatGPT号称史上最强大的人工智能&#xff0c;它通过学习和理解人类语言与我们对…

玩具取名

看到长度是\(200\)&#xff0c;想到区间DP 但在这里说一下&#xff0c;设\(f[i][j]\)表示前\(i\)个字符&#xff0c;转换后以\(j\)结尾的最短长度是推不走的&#xff0c;因为原来的字符串的第\(i\)个字符合并之后产生的新字符有可能继续合并&#xff0c;这是有问题的

【成品论文57页】2024美赛F题成品论文57页+每一小问配套代码数据

基于数据预测下的减少非法野生动物贸易研究 近年来&#xff0c;非法野生动物贸易每年涉及的金额高达 265 亿美元&#xff0c;被认为是全球第四大 非法贸易。本文基于收集的数据&#xff0c; 对非法野生动物贸易进行研究。 问题一&#xff0c;为了确定五年项目的研究对象我们利用…

PXIe-5842第三代PXI矢量信号收发器简介

内容 简介​PXIe-5842 VST的主要特性PXI VST软件工具PXI VST应用结论下一步 简介 NI于2012年引入了矢量信号收发器(VST)的概念。VST将RF信号发生器、RF信号分析仪和功能强大的FPGA集成在单个PXI模块上。PXIe-5842 VST是首款提供30 MHz到26.5 GHz连续频率覆盖范围的VST。PXIe…

百分点科技:《数据科学技术: 文本分析和知识图谱》

科技进步带来的便利已经渗透到工作生活的方方面面&#xff0c;ChatGPT的出现更是掀起了新一波的智能化浪潮&#xff0c;推动更多智能应用的涌现。这背后离不开一个朴素的逻辑&#xff0c;即对数据的收集、治理、建模、分析和应用&#xff0c;这便是数据科学所重点研究的对象——…

Blender 与 3ds Max | 面对面的直接较量(2024)

Blender和3ds Max&#xff0c;哪个动画软件更好&#xff1f;作为一个从事动画领域十年的专业人士&#xff0c;Mark McPherson提供了八条最新建议&#xff0c;帮助你了解哪个软件更适合满足你的3D动画需求。 1.建模 获胜者&#xff1a;3ds Max。3ds Max的建模机制已经被证明是…

Leetcode刷题笔记题解(C++):36. 有效的数独

思路一&#xff1a;暴力破解&#xff0c;两个二维数组记录行、列对应的数字出现的次数&#xff0c;比如rows[i][index]表示的数字index在i行出现的次数&#xff0c;三维数组记录每个块中对应数字出现的次数&#xff0c;比如boxes[i/3][j/3][index]表示的数字index在[i/3][j/3]个…

031 递归

何为递归 示例 public static void main(String[] args) {System.out.println(fn(5)); }static int fn(int a){return a 1 ? 1 : a * fn(a - 1); }

conda虚拟环境基础

【一文搞定最新版Anaconda】Win11 安装 Anaconda&#xff08;2023.9&#xff09;详解&#xff08;不删除旧版情况下下载、安装、注册、登录、设置环境变量、迁移旧环境、配置修改换源等&#xff09;连接Pycharm_win11安装anaconda-CSDN博客 conda命令大全&#xff08;create/in…

基于大数据的淘宝电子产品数据分析的设计与实现

&#xff08;1&#xff09;本次针对开发设计系统并设置了相关的实施方案&#xff0c;利用完整的软件开发流程进行分析&#xff0c;完成了设置不同用户的操作权限和相关功能模块的开发&#xff0c;最后对系统进行测试。 &#xff08;2&#xff09;框架可以帮助程序开发者快速构建…

【Java程序设计】【C00195】基于SSM的影视创作论坛管理系统(论文+PPT)

基于SSM的影视创作论坛管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的影视创作论坛 本系统分为前台系统、后台管理员和后台会员3个功能模块。 前台系统&#xff1a;当游客打开系统的网址后&#xff0c;首先看…

2024美赛B题Searching for Submersibles原创论文完整版

Searching for Submersibles搜索潜水器 2024美赛B题Searching for Submersibles原创论文&#xff08;共38页&#xff09;部分内容&#xff0c;其余见文末&#xff1a; 整体框架&#xff1a; 1.1 问题背景与问题重述 海上游轮迷你潜水艇公司&#xff08;MCMS&#xff09;&…

前端学习笔记 | HTML5+CSS3静态网页制作的技巧(持续更新)

注&#xff1a;本文的css样式均使用less写法 1、字体居中 &#xff08;1&#xff09;先text-align:center;行内元素水平居中 &#xff08;2&#xff09;再line-heigh:(盒子高度);行内元素垂直居中 text-align: center;line-height: ( 30 / vw ); 2、盒子居中 情景1&#…

Vue引入Axios

1.命令安装axios和vue-axios npm install axios --save npm install vue-axios --save 2.package.json查看版本 3.在main.js中引用 import axios from axios; import VueAxios from vue-axios; Vue.use(VueAxios,axios) 4.如何使用 &#xff08;初始化方法&#xff09; 将下列代…

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第6章 逻辑斯谛回归与最大熵模型(1)6.1 逻辑斯谛回归模型

文章目录 第6章 逻辑斯谛回归与最大熵模型6.1 逻辑斯谛回归模型6.1.1 逻辑斯谛分布6.1.2 二项逻辑斯谛回归模型6.1.3 模型参数估计6.1.4 多项逻辑斯谛回归 《统计学习方法&#xff1a;李航》笔记 从原理到实现&#xff08;基于python&#xff09;-- 第3章 k邻近邻法 《统计学习…

Spring 事务原理总结三

今天这篇文章&#xff0c;我想梳理一下Spring事务用到的几个核心组件。这些核心组件是我们理解Spring事务原理的基础。通过它们我们可以体会学习一下Spring设计者设计Spring事务时的基本思路。这些组件是&#xff1a;TransactionInfo、TransactionStatus、TransactionManager、…

【Chrono Engine学习总结】2-可视化

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 0、基本概念 类型说明&#xff1a; Chrono的可视化包括两块&#xff1a;实时可视化&#xff0c;以及离线/后处理可视化。 其中&#xff0c;实时可视化&#xff0c;又…

字节测试岗3面都过了,最后因为这个被刷。。。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 说在前面 面试时最好不要虚报工资。本来字节跳动是很想去的&#xff0c;几轮面试也通过了&…

【Crypto | CTF】BUUCTF 大帝的密码武器1

天命&#xff1a;这题真的是来刷经验的&#xff0c;有点吐血 首先这题是贼简单&#xff0c;但我居然跪到了&#xff0c;所以特此写这一篇来惩戒自己心太大 拿到文件&#xff0c;文件写着zip&#xff0c;改成zip后缀名即可&#xff0c;也不算啥难的 打开里面的两份文件&#x…

PythonStudio 控件使用常用方式(七)TEdit

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;它使用的是Delphi的控件&#xff0c;常用的内容是与Delphi一致的。但是相关文档并一定完整。现在我试试能否逐步把它的控件常用用法写一点点&#xff0c;也作为PythonStudio的参考。 TEdit就是单行文本框 常用属性 A…