JAVA多线程CountDownLatch使用详解

JAVA多线程CountDownLatch使用详解

什么是CountDownLatch

CountDownLatch是一种同步工具类,它可以让一个或多个线程等待其他线程完成操作后再执行。其主要方法是:

public class CountDownLatch {
    public CountDownLatch(int count);
    public void await() throws InterruptedException;
    public void countDown();
}

其中,构造函数里的参数count指定了计数器的初始值,等待线程可以调用await()方法来等待计数器变为0,而其他线程调用countDown()方法来减少计数器的值。当计数器变为0时,所有等待的线程均被唤醒。

CountDownLatch使用示例

下面分别给出两种使用CountDownLatch的示例。

示例一:多线程文件下载

在多线程文件下载的过程中,需要等待所有线程都将文件下载完成后,才能将这些文件合并成一个完整的文件。

public class MultiThreadDownloader {
    public static void main(String[] args) {
        // 文件下载链接列表
        List<String> urls = Arrays.asList(
                "https://example.com/file1",
                "https://example.com/file2",
                "https://example.com/file3"
        );
        // 创建一个CountDownLatch实例
        CountDownLatch latch = new CountDownLatch(urls.size());
        // 启动多个线程去下载文件
        for (String url: urls) {
            new Thread(() -> {
                // 下载文件
                download(url); 
                // 减少计数器的值
                latch.countDown();
            }).start();
        }
        // 等待所有线程下载完成
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 合并文件
        mergeFiles();
    }
}

在上面的示例中,首先创建一个CountDownLatch实例,然后创建多个线程去下载文件,每个线程下载完成后,都会调用countDown()方法来减少计数器的值,最后等待所有线程下载完成后,再合并这些文件。

示例二:线程池任务等待

在使用线程池执行任务的时候,有时候需要等待所有任务都执行完毕后再执行某些操作。这个时候,也可以使用CountDownLatch来实现。

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 创建一个线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        // 创建一个CountDownLatch实例
        CountDownLatch latch = new CountDownLatch(10);
        // 提交多个任务到线程池中
        for (int i = 0; i < 10; i++) {
            executorService.submit(() -> {
                // 执行任务
                doTask();
                // 减少计数器的值
                latch.countDown();
            });
        }
        // 等待所有任务执行完毕
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 关闭线程池
        executorService.shutdown();
    }

    private static void doTask() {
        // 模拟任务执行
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,首先创建一个线程池,然后创建一个CountDownLatch实例,并提交多个任务到线程池中。每个任务执行完毕后,都会调用countDown()方法来减少计数器的值,最后等待所有任务执行完毕后,再关闭线程池。

总结

CountDownLatch是一个非常有用的同步工具类,可以让多个线程之间协调、同步。它的使用方法比较简单,只需要先创建一个实例,然后等待线程调用countDown()方法来减少计数器的值,并在需要等待的地方调用await()方法等待计数器变为0即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA多线程CountDownLatch使用详解 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • Java实现简易学籍管理系统

    Java实现简易学籍管理系统攻略 1. 需求分析 首先需要分析所需的功能有哪些。本学籍管理系统具备如下功能: 学生信息管理:包括新增、修改、删除和查询学生信息。 成绩管理:包括新增、修改、删除和查询学生成绩。 日志管理:记录管理员对学生信息和成绩的增删改查操作。 2. 技术选型 学籍管理系统需要操作数据库来进行数据的存储和修改,因此需要选用适合的数据库和对应…

    Java 2023年5月23日
    00
  • SpringBoot 整合mapstruct的实现步骤

    下面是详细讲解“SpringBoot 整合 MapStruct 的实现步骤”的完整攻略。 什么是 MapStruct MapStruct 是一个在编译时期通过注解自动生成 Java Bean 映射代码的框架。它具有简单易用、高效准确等特点,可以大幅度提升 Java Bean 映射的开发效率。 SpringBoot 整合 MapStruct 的实现步骤 步骤一…

    Java 2023年5月20日
    00
  • Java解析使用JSON的多种方法

    以下是详细讲解“Java解析使用JSON的多种方法”的完整攻略: 什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON格式的数据通常用于异步浏览器/服务器数据交换。 JSON格式的数据由键值对组成,类似于JavaScript中的对象(对象是由编号的…

    Java 2023年5月20日
    00
  • java 如何判断是否是26个英文字母

    要判断一个字符是否为26个英文字母中的一个,Java中可以使用Character类提供的isLetter()方法进行判断。isLetter()方法判断一个字符是否为字母,其定义如下: public static boolean isLetter(char ch) 该方法接受一个字符参数ch,并返回一个boolean类型的值表示该字符是否为字母。 示例1:使用…

    Java 2023年5月27日
    00
  • Java遍历集合方法分析(实现原理、算法性能、适用场合)

    Java遍历集合是每个Java开发者都必须学会的一个技能。它是处理集合数据的重要步骤。本文将详细讲解Java遍历集合方法的实现原理、算法性能和适用场合。 什么是Java集合 Java集合是Java语言提供的一组数据结构,用于存储数据的容器。它们是一种实用工具,可用于处理复杂的数据结构,例如列表、队列、栈、哈希表等。Java集合框架是一组接口和类的集合,用于处…

    Java 2023年5月19日
    00
  • 学习javaweb如何配置Tomcat的热启动

    学习 JavaWeb 开发的第一步必须掌握如何配置 Tomcat 的热部署,这样对我们的开发有非常大的帮助。以下是配置 Tomcat 热部署的完整攻略: 1. 下载安装 Tomcat 首先,你需要到官网(https://tomcat.apache.org/)下载 Tomcat 的最新安装包,然后按照官方指南进行安装。这里以 Tomcat 9 版本为例。 2.…

    Java 2023年6月2日
    00
  • SpringMVC五大组件与执行原理分析总结

    SpringMVC五大组件与执行原理分析总结 SpringMVC是一个基于MVC架构的Web框架,它可以用于构建Web应用程序。SpringMVC框架提供了一组组件,包括控制器、视解析器、处理映射器、数据绑定、数据验证、异常处理等,可以帮助我们快速开发Web应用程序。在SpringMVC中,五大组件分别是:前端控制器、处理器映射器、处理器适配器、视图解析器、…

    Java 2023年5月18日
    00
  • Java 自定义动态数组方式

    Java中没有内置的动态数组类,需要我们自己实现。下面是Java自定义动态数组的完整攻略。 需求分析 我们需要实现一个具有动态扩容功能的数组。当数组空间不够时,需要动态扩充,保证数据能够正常存储。 实现步骤 定义一个数组类,包含数组容量大小、元素个数和数组本身三个属性。 java public class CustomArray<T> { pri…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部