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

关注:CodingTechWork

引言

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

本次主要考虑使用CountDownLatch工具类进行并发编程的控制。

CountDownLatch

概述

在并发编程过程中,如何让多个线程之间协调执行任务,如主线程等所有其他异步线程执行完毕后再继续执行下面的步骤,如何做到?我们可以考虑使用CountDownLatch

CountDownLatch主要是起到线程之间的同步协调作用,而不是互斥。它可以让一个线程等待其他线程完成任务后,再继续执行自己的任务。

原理

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

并发编程实践

基本用法

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

代码模板

java 复制代码
    public Boolean testCountDownLatchAsync() {
        ExecutorService taskExecutor = Executors.newFixedThreadPool(10);
        //初始化
        final CountDownLatch latch = new CountDownLatch(10);
        for (Integer customerId : customerIdList) {
            Runnable run = new Runnable() {
                @Override
                public 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()方法即可实现编程。

相关推荐
Tigshop开源商城3 小时前
『物流设置+SEO优化』Tigshop开源商城系统 JAVA v5.8.26 版本更新!
java·开源商城系统·tigshop
Tigshop开源商城5 小时前
『订单税率+收货地址校验国家字段』功能上新|跨境运营更高效,Tigshop开源商城系统 JAVA v5.8.23 版本更新
java·开源商城系统·tigshop
养肥胖虎5 小时前
Docker学习笔记:后端、数据库和反向代理怎么一起跑起来
后端·nginx·docker·postgresql·go·部署
REDcker5 小时前
C++变量存储与ELF段布局详解 从const全局到rodata与nm_readelf验证实践
java·c++·面试
晓杰'6 小时前
从0到1实现 Balatro 游戏后端(2):NestJS框架搭建与项目结构设计
后端·websocket·typescript·node.js·游戏开发·项目实战·nestjs
无所事事O_o6 小时前
二次验证码TOTP 使用说明
后端·二次验证码·谷歌验证器
ltl6 小时前
Multi-Head Attention:为什么要分多个头
后端
kobesdu7 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
neo_Ggx237 小时前
Maven 版本管理详解:SNAPSHOT、Release 与 Nexus 仓库的区别和影响
java·maven
matlabgoodboy7 小时前
软件开发定制小程序APP帮代做java代码代编写C语言设计python编程
java·c语言·小程序