当前位置: 首页 > news >正文

Java | 多线程并发编程CountDownLatch实践

关注:CodingTechWork

引言

  在一次数据割接需求中,数据需要通过编程的方式进行转移割接到新平台,此时若串行化方式,无疑会拉锯此次战斗,所以首当其冲要使用并发编程来降低割接时长。
  本次主要考虑使用CountDownLatch工具类进行并发编程的控制。

CountDownLatch

概述

  在并发编程过程中,如何让多个线程之间协调执行任务,如主线程等所有其他异步线程执行完毕后再继续执行下面的步骤,如何做到?我们可以考虑使用CountDownLatch
  CountDownLatch主要是起到线程之间的同步协调作用,而不是互斥。它可以让一个线程等待其他线程完成任务后,再继续执行自己的任务。

原理

  1. CountDownLatch是基于计数器的原理,内部有一个整型的计数器。
  2. 在类中使用CountDownLatch时,需要制定一个初始的计数值,该值指定的事需要等待的线程数目。
  3. 关于计数值,每当完成一个线程任务时,会调用CountDownLatchcountDown()方法,计数器值就会递减1。当计数值递减到0时,就会唤醒等待的线程,继续执行等待线程的任务。

并发编程实践

基本用法

  1. 创建CountDownLatch对象,初始化指定计数值(等待线程数)。
  2. 创建多线程,线程执行完毕后,调用countDown()方法。
  3. 等待线程执行await()方法,等待计数值递减为0后继续执行本线程的程序。

代码模板

    public Boolean testCountDownLatchAsync() {ExecutorService taskExecutor = Executors.newFixedThreadPool(10);//初始化final CountDownLatch latch = new CountDownLatch(10);for (Integer customerId : customerIdList) {Runnable run = new Runnable() {@Overridepublic void run() {try {//异步执行代码} catch (Exception e) {log.error("线程执行失败!错误信息:", e);} finally {latch.countDown(); //每次调用CountDown(),计数减1}}};taskExecutor.execute(run);}try {//等待所有线程执行完毕latch.await();//主程序执行到await()函数会阻塞等待线程的执行,直到计数为0} catch (InterruptedException e) {e.printStackTrace();}taskExecutor.shutdown();//关闭线程池return true;}

总结

  CountDownLatch是一个同步工具类,主要应用于多线程编程场景中,可以用于控制等待线程的执行,或者说是协调多个线程之间的同步。
  用好这个工具类,主要关注这个工具类的初始计数值的设置、countDown()方法、await()方法即可实现编程。

http://www.lryc.cn/news/242630.html

相关文章:

  • 分布式定时任务系列6:XXL-job触发日志过大引发的CPU告警
  • Spark RDD、DataFrame和Dataset的区别和联系
  • 代码随想录算法训练营第四十五天|139.单词拆分、背包问题总结
  • 深度学习卫星遥感图像检测与识别 -opencv python 目标检测 计算机竞赛
  • wxWidgets 3.2.4发布 —— 发布于2023年11月11日
  • PyQt6运行QTDesigner生成的ui文件程序
  • 基于mediapipe的人手21点姿态检测模型—CPU上检测速度惊人
  • 系统架构设计: 21 论敏捷软件开发方法及其应用
  • 【深度学习】脸部修复,CodeFormer,论文,实战
  • OpenGL_Learn14(光照贴图)
  • 【JVM精讲与GC调优教程(概述)】
  • 蓝桥杯物联网竞赛_STM32L071_2_继电器控制
  • python之pyqt专栏2-项目文件解析
  • Kafka 集群如何实现数据同步
  • opencv- CLAHE 有限对比适应性直方图均衡化
  • IOS免签封装打包苹果APP的方法
  • Springboot引入分布式搜索引擎Es RestAPI
  • Lua脚本解决redis实现的分布式锁多条命令原子性问题
  • Vatee万腾独特科技力量的前沿探索:Vatee的数字化奇点
  • C++面试,const的使用
  • 小总结----长度
  • 【深度学习】如何选择神经网络的超参数
  • jQuery 3.0 新增了哪些特性?(jQuery 3 所引入的那些最重要的变化)
  • MindStudio学习一 整体介绍
  • excel表中慎用合并单元格,多用跨列居中
  • linux网络编程之UDP编程
  • YB4556 28V、1A、单节、线性锂电池充电IC
  • 基于单片机设计的大气气压检测装置(STC89C52+BMP180实现)
  • 【ChatGLM3-6B】Docker下部署及微调
  • 编程常见报错信息及解决方案汇总