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

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.mzph.cn/news/665208.shtml

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

相关文章

面试数据结构与算法总结分类+leetcode题目目录【基础版】

&#x1f9e1;&#x1f9e1;&#x1f9e1;算法题目总结&#xff1a; 这里为大家总结数据结构与算法的题库目录&#xff0c;如果已经解释过的题目会标注链接更新&#xff0c;方便查看。 数据结构概览 Array & String 大家对这两类肯定比较清楚的&#xff0c;同时这也是面试…

Java基础—反射

Java基础-反射 前置知识动态语言JVM堆Java引用变量类型编译时类型运行时类型举栗特殊情况 RRTI概念为什么需要RTTI例子 Class类对象前置知识类加载器概念作用 Class类对象的概念Class类对象的总结 总结一下前置知识 反射基础概念为什么要学反射我需要学到什么程度 反射的基础内…

GMT绘图笔记

(1)图框设置。在利用GMT绘制图件时&#xff0c;需要设置边框的类型&#xff0c;字体的大小&#xff0c;标记距离边框的距离。主要涉及的参数有&#xff1a; gmt set MAP_FRAME_TYPE plain/fancy 可以调整边框为火车轨道或者线段。 (2)调整图框的粗细&#xff1a;主要是包含有…

解决vue3+ts打包,ts类型检查报错导致打包失败,goview打包报错options

最近拉的开源大屏项目goview&#xff0c;在打包的过程中一直报Ts类型报错导致打包失败&#xff0c;项目的打包命令为&#xff1a; “build”: “vue-tsc --noEmit && vite build” 是因为 vue-tsc --noEmit 是 TypeScript 编译器&#xff08;tsc&#xff09;的命令&…

Mov转MP4怎么转换?如何播放mov视频?

MOV文件格式的使用场景 MOV文件格式以其支持多种媒体数据类型的特性而闻名&#xff0c;包括视频、音频、文本、动画等。它常用于存储包含视频剪辑、电影、音频轨道等多媒体元素的文件。由于其在质量和编辑方面的优越性&#xff0c;MOV文件在电影制作、广告宣传、多媒体演示等领…

MySQL篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、InnoDB与MyISAM的区别二、索引三、常见索引原则有前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、InnoDB与MyISAM…

【华为】GRE VPN 实验配置

【华为】GRE VPN 实验配置 前言报文格式 实验需求配置思路配置拓扑GRE配置步骤R1基础配置GRE 配置 ISP_R2基础配置 R3基础配置GRE 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立 配置文档 前言 VPN &#xff1a;&#xff08;Virtual Private Network&#xff09;&#xff0c;即“…

【京东云新品发布月刊】2024年1月产品动态来啦

1&#xff09;【莫奈可视化平台】新品上线 京东莫奈可视化平台通过自由拖拽、图形化编辑、所见即所得的方式&#xff0c;快速实现极致酷炫、直观清晰的视觉场景&#xff0c;将海量繁杂数据背后所蕴含的价值更直观、深层、全面的展现出来&#xff0c;辅助决策者合理决策。 2&a…

Redis集群环境搭建

Redis集群环境搭建 Redis主从复制 概念 主从复制是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器&#xff0c;前者称为主节点(master/leader)&#xff0c;后者称为从节点(slave/followe)&#xff1b;数据的复制是单向的&#xff0c;只能从主节点到从节点&a…

学成在线: 新增/修改课程计划

新增/修改课程计划(同接口) 界面原型 第一步: 在课程计划界面,点击添加章新增第一级课程计划,点击添加小节可以向某个第一级课程计划下添加小节 新增章/节成功后会自动发起请求刷新课程计划列表并且把新增的课程计划信息添加到数据库当中,新增的课程计划自动排序到最后 第二…

CentOS 8 下载

https://mirrors.bfsu.edu.cn/centos/8-stream/isos/x86_64/ 下载地址&#xff1a; https://mirrors.bfsu.edu.cn/centos/8-stream/isos/x86_64/CentOS-Stream-8-x86_64-latest-dvd1.iso

喜报|博睿数据算力调度可观测平台荣获信通院“算力服务领航者计划”优秀案例

近日&#xff0c;中国通信标准化协会云计算标准和开源推进委员会2023年度工作总结会暨算力服务工作组成果发布会在京举行。会上&#xff0c;“2023年算力服务领航者计划优秀案例名单”正式公布&#xff0c;博睿数据的核心产品算力调度可观测平台 Bonree ONE成功入选&#xff0c…

数据结构----队列(Queue)的概念、队列的使用、模拟实现队列、循环队列、模拟实现循环队列、双端队列、模拟实现双端队列

文章目录 1 概念2 队列的使用3 队列模拟实现4 循环队列4.1 循环队列 概念4.1 循环队列模拟实现 5. 双端队列 (Deque)6 用队列实现栈7 用栈实现队列 1 概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有…

LeetCode:283. 移动零

283. 移动零 1&#xff09;题目2&#xff09;代码方法一&#xff1a;两层for循环方法二&#xff1a;使用双指针 3&#xff09;结果方法一结果方法二结果 1&#xff09;题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的…

QT研究笔记(一)windows 开发环境安装部署

一、Qt 是什么&#xff1f; Qt 是一个跨平台的应用程序开发框架&#xff0c;最初由挪威的 Trolltech 公司开发&#xff0c;并于2008年被诺基亚收购。后来&#xff0c;Qt 框架由 Digia 公司接手&#xff0c;并在2012年成立了 The Qt Company。Qt 提供了一套丰富的工具和类库&am…

如何学习亚马逊、速卖通和阿里国际站等平台的测评自养号技术?

由于近年来各大平台纷纷开展开店政策&#xff0c;并得到国家对跨境电商的大力支持&#xff0c;吸引了众多中国卖家加入其中&#xff0c;每年呈逐渐增长的趋势。然而&#xff0c;与国内的淘宝、京东等平台不同&#xff0c;亚马逊并没有实时通讯工具和客服&#xff0c;卖家在购买…

OceanBase 4.2.2 GA 发布,全新特性快速预览!

在 2023 年度发布会上&#xff0c;OceanBase 沿着“一体化”产品战略思路&#xff0c;发布了一体化数据库的首个长期支持版本 4.2.1 LTS。作为 4.0 系列的首个 LTS 版本&#xff0c;该版本的定位是支撑客户关键业务稳定长久运行&#xff0c;我们非常认真的打磨了这个版本&#…

代码随想录算法训练营Day46|139.单词拆分、多重背包理论基础、背包问题总结

目录 139.单词拆分 方法一&#xff1a;回溯法 算法实现 方法二&#xff1a;背包问题 算法实现 多重背包理论基础 思路 算法实现 背包问题总结 前言 背包递推公式 遍历顺序 0-1背包 完全背包 139.单词拆分 题目链接 文章链接 方法一&#xff1a;回溯法 在回溯专题…

XXE基础知识整理(附加xml基础整理)

全称&#xff1a;XML External Entity 外部实体注入攻击 原理 利用xml进行读取数据时过滤不严导致嵌入了恶意的xml代码&#xff1b;和xss原理雷同 危害 外界攻击者可读取商户服务器上的任意文件&#xff1b; 执行系统命令&#xff1b; 探测内网端口&#xff1b; 攻击内网网站…

【八大排序】冒泡排序 | 快速排序 + 图文详解!!

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C语言进阶之路 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 交换排序一、冒泡排序1.1 算法步骤 动图演示1.2 冒泡排序的效率分析1.3 代码实现1.4 …