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日

相关文章

  • Spring Boot全局统一异常处理器

    Spring Boot全局统一异常处理器 在Spring Boot应用中,处理异常是一个非常重要的问题,因为不处理异常会导致程序出现问题。为了避免应用程序因异常而出现问题,我们需要使用一个全局统一异常处理器。 配置 在 Spring Boot 应用中,需要定义一个 @ControllerAdvice 注解的异常处理类,如下所示: @ControllerAdv…

    Java 2023年5月27日
    00
  • 通过java备份恢复mysql数据库的实现代码

    下面我将详细讲解通过Java备份恢复MySQL数据库的实现代码的完整攻略。 1. 环境准备 1.1 安装MySQL 首先需要安装好MySQL数据库,可以在https://dev.mysql.com/downloads/mysql/下载最新版本的MySQL Community Server。 1.2 安装Java 在使用Java备份恢复MySQL数据库之前,需…

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

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

    Java 2023年5月20日
    00
  • 使用阿里云OSS的服务端签名后直传功能的流程分析

    使用阿里云OSS的服务端签名后直传功能的流程分析可以分为以下几个步骤: 1. 准备工作 在使用阿里云OSS的服务端签名后直传功能之前,需要先进行一些准备工作: 获得阿里云OSS的AccessKeyId和AccessKeySecret 根据需要,创建阿里云OSS的Bucket,并设置Bucket的访问权限 确定需要上传到阿里云OSS的文件的名称和存放路径 2.…

    Java 2023年5月23日
    00
  • java垃圾回收之实现串行GC算法

    Java垃圾回收之实现串行GC算法 Java中的垃圾回收是自动进行的,它可以在运行程序时自动回收不再使用的内存。在JVM内部,有实现并发垃圾回收的算法,其中之一是串行GC算法。 什么是串行GC算法 串行GC算法是JVM中最简单的垃圾回收算法之一。它通过暂停所有线程,并在单个线程中执行垃圾回收操作。这使得垃圾回收器能够在运行过程中直接操作堆内存。由于串行GC只…

    Java 2023年5月19日
    00
  • Spring Cloud Feign 自定义配置(重试、拦截与错误码处理) 代码实践

    下面是关于“Spring Cloud Feign 自定义配置(重试、拦截与错误码处理)”的完整攻略详情。 1. 什么是 Spring Cloud Feign Spring Cloud Feign 是一个声明式 REST 客户端,它使通过 HTTP 通信的服务调用变得更加简单。 Feign 会通过定义接口的方式来注入需要访问的远程服务,这样就可以像调用本地方法…

    Java 2023年5月20日
    00
  • java书店系统毕业设计 总体设计(1)

    Java书店系统毕业设计是一个典型的软件工程项目,需要经过总体设计、详细设计、编码实现、系统测试等多个阶段完成。其中,总体设计是系统设计的一个重要阶段,它主要确定系统的整体结构和组成,包括各个模块的功能、接口、输入输出关系等,为后续的详细设计提供基础。下面我将从以下几个方面详细讲解Java书店系统毕业设计的总体设计攻略。 总体设计概述 描述软件系统的总体框架…

    Java 2023年5月24日
    00
  • Java运算符的知识点与代码汇总

    Java运算符的知识点与代码汇总 1. 概述 Java运算符是Java语言中用于完成各种算数、关系和逻辑运算的符号。在Java程序中,运算符经常被用于各种运算表达式中,通过运算符可以组合复杂的逻辑表达式,完成各种数据计算和判断。本文将详细讲解Java运算符的知识点和一些常见的使用示例。 2. 分类 Java运算符可分为以下几类: 算术运算符 赋值运算符 自增…

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