首页 > 编程语言 >Java | 多线程并发编程CountDownLatch实践

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

时间:2023-12-18 12:32:46浏览次数:37  
标签:执行 Java 编程 线程 CountDownLatch 多线程 等待 await


关注: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() {
                @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()方法即可实现编程。


标签:执行,Java,编程,线程,CountDownLatch,多线程,等待,await
From: https://blog.51cto.com/u_16102572/8871437

相关文章

  • 无涯教程-Java's Built-in Exceptions函数
    Java在标准包java.lang中定义了几个异常类。这些异常中最通用的是标准类型RuntimeException的子类。由于java.lang被隐式导入所有Java程序中,因此从RuntimeException派生的大多数异常都是自动可用的。Java定义了与其他各种类库相关的几种其他类型的异常。以下是JavaUnchecke......
  • 关于python http.server 开启多线程并发的问题
    问题描述thon中的http.server模块是单线程的,这意味着它一次只能处理一个请求,而其他请求必须等待。为了解决这个问题,您可以考虑使用多线程或异步处理来处理并发请求。您可以使用Python的ThreadingMixIn来创建一个支持多线程的HTTP服务器,或者考虑使用异步框架如asyncio来处理请求......
  • idea java import 规范化
    参考官方配置文件功能介绍一些标准会针对import的顺序、import*的使用有一定的要求,为了避免手动调整的窘境,可以通过idea基础配置,来实现import的自动格式化、规范化。配置路径:Settings-->Editor-->CodeStyle-->Java-->Imports选项内容解析:Layoutstaticimportsseparat......
  • Java互联网+公立医院绩效考核源码
    一、建设信息化医院绩效考核的意义1.提高考核效率:通过信息化手段,可以将绩效考核数据自动采集、整理、分析和报告,大大提高了考核效率,减少了人工干预和错误率。2.增强考核公正性:信息化考核可以减少人为因素的干扰,使考核更加公正、客观。同时,通过数据共享,可以增强考核结果的透明度和......
  • 暹罗外卖开源啦,一款java多商户外卖系统-商家入驻如美团饿了么
    暹罗外卖v1.0基于Vue/ElementUI和SpringCloud&Alibaba前后端分离的分布式微服务架构前言微信公众号【暹罗siam】,未来将会在公众号上持续性的输出很多原创小知识以及学习资源,欢迎各位小伙伴关注我,和我一起共同学习,同时我也希望各位小伙伴能够给暹罗外......
  • 多线程+信号量同步线程
    实现场景:多线程+信号量实现线程同步执行线程在创建的时候并不能保证优先顺序,是异步的,如果想按照自己指定的顺序先后执行的话,可以使用一些互斥或者同步的方式;以下我是通过信号量来实现同步:信号量的类型是sem_t,需要的头文件是 #include<semaphore.h>,主要是方法是sem_init......
  • 无涯教程-Java - ByteArrayOutputStream函数
    ByteArrayOutputStream类流在内存中创建一个缓冲区,所有发送到该流的数据都存储在该缓冲区中。以下是ByteArrayOutputStream类将提供的构造函数的列表。Sr.No.Constructor&Remark1ByteArrayOutputStream()此构造函数创建一个具有32字节缓冲区的ByteArrayOutputStream。......
  • 流畅的orm让我发现我抵触的是mybatis而不是java
    流畅的orm让我发现我抵触的是mybatis而不是java背景介绍开发.net也快10年了,到第三年的时候我已经渐渐瓶颈了,于是我在网上找各种资料但是大部分c#资料全是皮毛资料,稍微深一点点就再讲表达式expression,感觉完全没有那个深度,但是同时期的java讲解的都是基本原理,和框架思......
  • JavaScript中的现代运算符:?.、?? 和 ??=
    在JavaScript中,?.、??和??=是相对较新的运算符,分别用于可选链、空值合并和空值合并赋值。这些运算符提供了更加简洁和安全的方式来处理未定义(undefined)或空(null)的值。JavaScript的发展一直在不断进步,近年来,ES6及后续版本引入了许多实用的新特性。其中,?.、??和??=这三个运算......
  • 无涯教程-Java - String toUpperCase()函数
    将字符串转成大写字母,这等效于调用toUpperCase(Locale.getDefault())。StringtoUpperCase()-语法publicStringtoUpperCase()StringtoUpperCase()-返回值它返回字符串,并转换为大写。StringtoUpperCase()-示例importjava.io.*;publicclassTest{publics......