首页 > 编程语言 >java 多线程CountDownLatch

java 多线程CountDownLatch

时间:2024-05-09 10:24:15浏览次数:26  
标签:多线程 java name 工人 任务 线程 CountDownLatch latch

 CountDownLatch 简介

CountDownLatch 是 Java 中的一个同步工具类,可以用来确保一组线程等待其他线程完成各自工作后再继续执行。

CountDownLatch 的应用场景

CountDownLatch 可以被广泛应用于各种多线程协作的场景,例如:

  • 主线程等待多个子线程完成后再执行下一步操作。
  • 多个子任务并行执行,最后合并结果。
  • 并行计算中,等待所有计算任务完成后进行统一汇总。

CountDownLatch 的优缺点分析
优点
简单易用:CountDownLatch 的使用非常简单,通过 await 和 countDown 方法即可实现多线程的协作。
灵活性:可以根据具体场景指定等待的计数值,可以灵活控制多个线程的协作关系。
高效性:底层使用了 AQS(AbstractQueuedSynchronizer)来实现同步,能够保证高效地协调多个线程的执行顺序。
缺点
一次性:CountDownLatch 的计数值只能减少,无法重置。一旦计数值减至零,就不能再次使用。
无法中途取消:一旦等待开始,就无法中途取消等待,除非等待超时或者发生中断。

CountDownLatch 的使用案例

 以下是一个简单的使用 CountDownLatch 的例子,假设有一个任务分配系统,其中有多个工人(线程)在处理任务,而一个管理者(主线程)需要等待所有工人完成他们的任务后才继续执行。

import java.util.concurrent.CountDownLatch;
 
public class Main {
    public static void main(String[] args) throws InterruptedException {
        int workerCount = 5; // 假设有5个工人
        CountDownLatch latch = new CountDownLatch(workerCount);
 
        for (int i = 0; i < workerCount; i++) {
            Worker worker = new Worker(latch, "Worker " + i);
            Thread thread = new Thread(worker);
            thread.start();
        }
 
        latch.await(); // 等待所有工人完成任务
        System.out.println("所有工人任务完成,管理者继续执行。");
    }
 
    static class Worker implements Runnable {
        private CountDownLatch latch;
        private String name;
 
        public Worker(CountDownLatch latch, String name) {
            this.latch = latch;
            this.name = name;
        }
 
        @Override
        public void run() {
            // 工人执行任务
            doWork();
            latch.countDown(); // 工人完成任务,计数减一
        }
 
        private void doWork() {
            System.out.println(name + " 开始工作。");
            try {
                Thread.sleep(1000); // 模拟工作耗时
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(name + " 工作完成。");
        }
    }
}

 

在这个例子中,我们创建了一个 CountDownLatch 实例,其计数器初始化为工人的数量(workerCount)。每个工人线程在开始后会立即执行它的任务,任务完成后会调用 countDown 方法。主线程在开始时调用 latch.await() 方法等待计数器变为0,即所有工人完成任务。当所有工人完成任务后,计数器变为0,await 方法返回,主线程继续执行。

 

标签:多线程,java,name,工人,任务,线程,CountDownLatch,latch
From: https://www.cnblogs.com/yeyuzhuanjia/p/18181532

相关文章

  • Java学设计模式之工厂模式
    一、工厂模式概念工厂模式是一种创建型设计模式,用于创建对象而不需要暴露对象的创建逻辑。它将对象的实例化过程封装在一个单独的类中,使得客户端代码只需通过调用工厂类的方法来获取所需的对象,而无需关心具体的实例化过程。工厂模式通常有三种主要的变体:简单工厂模式、工厂方法......
  • 关于Java Chassis 3的契约优先(API First)开发
    本文分享自华为云社区《JavaChassis3技术解密:契约优先(APIFirst)开发》,作者:liubao68。契约优先(APIFirst)开发是指应用程序开发过程中,将API设计作为第一优先级的任务。契约优先开发随着WebServices概念的发展而不断得到重视,特别是微服务架构出现以后,API设计成为影响功能开放、......
  • 如果你还不了解 Java Class 文件结构,来看看这篇吧
    文章首发于【Java天堂】,跟随我探索Java进阶之路!Class文件是什么JavaClass文件是Java编译器将源代码编译后的二进制表示,它是Java虚拟机(JVM)运行的基础。Class文件绝大部分内容是在1997年发布的第一版《Java虚拟机规范》中就已经定义好的,后续20多年的发展过程当中Java经历了大......
  • 编程:java 发送email程序:通用版本:借鉴“蚂蚁小哥 <antladdie@163.com>”的文章
     1packagecom.alibaba.otter.canal.adapter.launcher.loader;23importjava.text.SimpleDateFormat;4importjava.util.*;5importjavax.mail.*;6importjavax.mail.internet.*;78publicclassJavaxJavaMailClient{910private......
  • Java ThreadLocal 类的使用
    基于Java-ThreadLocal类的使用整理ThreadLocal表示线程的局部变量,当前线程可以通过set/get来对这个局部变量进行操作,其他线程不能对其进行访问ThreadLocal支持泛型,也就是支持指定value类型,像是ThreadLocal<Date>就是指定value为Date类型。每个线程会有一......
  • Java容器化改造
    dockerjava项目容器化改造前后端分离项目前端https://gitee.com/yuco/eladmin-web.git后端https://gitee.com/yuco/eladmin.git要素:vuenpmspringbootmysqlredisjava后端容器化思路:了解在物理机虚拟机的部署流程,然后编写dockerfile进行容器化部署。java项目,使用mv......
  • 对接诺诺电子发票(Java)
    沙箱环境:url:https://sandbox.nuonuocs.cn/open/v1/servicesappKey:SD63236305appSecret:SDDED2523BED4643下载诺诺的SDK:SDK下载引入项目: 服务实现层代码://创建发票信息表@OverridepublicInvoiceDtocreate(Invoiceresources){resources.setId(snowflake.......
  • Java护照识别接口开发示例、文字识别、证件识别
    护照是我们出国旅行时所必要的证件之一,他是我国公民去外国的旅行和工作的时候所代表的一个合法的身份证件。在护照上面也有不少关于我们个人身份的信息,而手动去录入如此多的身份信息这绝对是灾难。不仅证件,有的场景还需要录入很多文字信息。翔云API可识别图片上的身份证、护......
  • Java实名认证API、婚恋网实名认证
    中国网络婚恋交友行业发展近20年,电脑端网络婚恋服务已经较为成熟,商业模式也较为完善。但随着移动互联网的快速发展,移动端成为婚恋交友企业核心用户新的来源渠道。网络婚恋交友移动端人群覆盖规模逐渐超过电脑端人群,标志着以移动端为主导的婚恋交友服务正式来临,整体行业迎来了......
  • javaScript之局部变量,全局变量与局部作用域,全局作用域
    前端开发工作者,最需要学习的一门语言就是JavaScript了吧,其实学习大部分编程语言都是从基本的语法知识开始人门的。什么语句、变量、数据类型、对象、函数...今天本文就简单说明javaScript变量中的一个小小的知识点,其实在后面的最开始工作编程中我也是常常容易出现bug的一个点。......