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()方法即可实现编程。

相关推荐
KaMeidebaby2 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_17683 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
Mininglamp_27183 小时前
Claude Code 封禁中国开发者之后:本地 AI 编程工具的替代方案实测
开发语言·人工智能·windows·开源软件·ai-native
思麟呀4 小时前
C++17(三)if constexpr+折叠表达式
开发语言·c++
醉城夜风~4 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
qydz114 小时前
杰理开发基础知识(3)
开发语言·嵌入式开发·杰理科技
贾斯汀frank4 小时前
C# 15 类型系统改进:Union Types
开发语言·windows·c#
阿里嘎多学长4 小时前
2026-07-10 GitHub 热点项目精选
开发语言·程序员·github·代码托管
CHHH_HHH4 小时前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
数智化转型推荐官5 小时前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务