Java并发包工具类CountDownLatch的应用详解

Java并发包工具类CountDownLatch的应用详解

CountDownLatch概述

CountDownLatch是java.util.concurrent包中提供的一个并发工具类,常用于控制多个线程等待一组事件的发生,直到所有的线程都达到某个状态后才能同时执行。

在CountDownLatch中,需要设定一个计数器,该计数器初始值为线程的数量,每个线程完成任务时都会使计数器减1,当计数器的值为0时,就说明所有的线程都已经完成了任务,这时等待中的线程可以开始执行。

CountDownLatch的使用场景

CountDownLatch常用于多线程任务协同处理的场景,例如:等待多个线程全部完成某件事情再执行下一步操作,等待多个线程都到达某个状态才能同时执行下一步操作,等待多个线程用完某个资源才能释放这个资源等。

CountDownLatch使用注意事项

  1. CountDownLatch一旦被初始化之后不能重新设置计数器的值。
  2. CountDownLatch计数器的值必须大于等于0,当计数器的值为0时,所有等待线程才能继续执行。
  3. CountDownLatch不支持中途增加或减少计数器的值,也不支持重置计数器的值。

CountDownLatch示例1-等待多个线程完成任务

import java.util.concurrent.CountDownLatch;

public class CountDownLatchDemo1 {
    public static void main(String[] args) {
        int N = 5;
        final CountDownLatch latch = new CountDownLatch(N);

        for (int i = 0; i < N; i++) {
            new Thread(() -> {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " finished");
                latch.countDown(); // 计数器减1
            }).start();
        }

        // 等待计数器变为0
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("All threads finished");
    }
}

代码输出如下:

Thread-0 finished
Thread-1 finished
Thread-2 finished
Thread-3 finished
Thread-4 finished
All threads finished

在这个例子中,主线程通过CountDownLatch等待5个子线程都执行完毕之后执行。

CountDownLatch示例2-线程协作同步

import java.util.concurrent.CountDownLatch;

public class CountDownLatchDemo2 {
    private static CountDownLatch startLatch = new CountDownLatch(1);
    private static CountDownLatch endLatch = new CountDownLatch(5);

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 5; i++) {
            new Thread(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + " waiting for startLatch");
                    startLatch.await();
                    System.out.println(Thread.currentThread().getName() + " started");
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName() + " finished");
                    endLatch.countDown();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }

        Thread.sleep(1000);
        startLatch.countDown();

        // 等待所有线程执行完毕
        endLatch.await();
        System.out.println("All threads finished");
    }
}

代码输出如下:

Thread-0 waiting for startLatch
Thread-4 waiting for startLatch
Thread-2 waiting for startLatch
Thread-1 waiting for startLatch
Thread-3 waiting for startLatch
Thread-1 started
Thread-0 started
Thread-2 started
Thread-4 started
Thread-3 started
Thread-1 finished
Thread-0 finished
Thread-2 finished
Thread-4 finished
Thread-3 finished
All threads finished

在这个例子中,5个线程竞争startLatch信号,只有当startLatch计数器为0时,所有线程才能开始执行;5个线程完成任务后,会将endLatch的计数器减1,当endLatch计数器为0时,主线程再继续执行。这个例子展示了CountDownLatch在多个线程协作同步的场景中的应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java并发包工具类CountDownLatch的应用详解 - Python技术站

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

相关文章

  • Java 判断数组是否相等的方法示例

    下面我将详细讲解Java中判断数组是否相等的方法示例的完整攻略: 1. 比较两个数组是否相等 要比较两个数组是否相等,可以采用 Arrays.equals() 方法,该方法的语法如下: Arrays.equals(array1, array2); 其中参数 array1 和 array2 分别表示需要比较的两个数组。该方法返回一个 boolean 类型的值,…

    Java 2023年5月26日
    00
  • SpringBoot整合MybatisSQL过滤@Intercepts的实现

    下面我将为您详细讲解Spring Boot整合Mybatis SQL过滤@Intercepts的实现的完整攻略。 一、介绍 在使用Mybatis框架时,可能会出现需要对传入的SQL参数进行过滤的需求,如防止SQL注入等。此时可以使用Mybatis提供的@Intercepts注解实现SQL过滤的操作,本文主要介绍如何将@Intercepts与Spring Bo…

    Java 2023年5月20日
    00
  • JavaBean和SpringBean的区别及创建SpringBean方式

    JavaBean和SpringBean的区别: JavaBean是Java语言编写的可重用组件,它是普通的Java类,遵循特定的约定(约定优于配置)。JavaBean将其属性封装在私有字段中,并提供公共的getter和setter方法以让外部程序可以访问这些私有属性。JavaBean可以在任何Java环境中被使用,例如Java SE、Java EE等。 Sp…

    Java 2023年5月19日
    00
  • Java实现的Windows资源管理器实例

    Java实现的Windows资源管理器实例攻略 简介 Windows资源管理器是微软操作系统中的一个重要工具,它提供了对文件和文件夹的管理、查看和操作功能。本文将讲解如何使用Java编写一个Windows资源管理器的实例程序,让使用者可以通过程序来管理和操作自己的文件夹和文件。 实现步骤 步骤一:创建文件夹和文件类 首先,我们需要创建两个类:Folder和F…

    Java 2023年5月19日
    00
  • JDBC以反射机制加载类注册驱动连接MySQL

    JDBC以反射机制加载类注册驱动连接MySQL的攻略如下: 导入相关的JDBC驱动jar包。假设我们使用MySQL数据库,需要下载并导入mysql-connector-java.jar包。如果不清楚如何导入jar包,可以自行查阅相关教程。 使用反射机制动态加载类。JDBC4.0以后的版本,不需要显式地调用Class.forName()方法加载驱动程序,但是我…

    Java 2023年6月16日
    00
  • Maven构建生命周期详细介绍

    介绍Maven构建生命周期之前,首先需要了解一下Maven中的概念: POM(Parent Object Model): Maven项目的核心文件,包含了项目的基本信息和配置信息。 Artifact(构件):是一个独立的、可重用的软件组件,包括代码和其所依赖的库、配置文件等。 Dependency(依赖):描述当前项目所依赖的其他构件,用于下载构件到本地仓库…

    Java 2023年5月20日
    00
  • 解析Java的迭代器中的fast-fail错误检测机制

    Java中的迭代器(Iterator)是一种常用的数据访问方式,但是如果多个线程同时操作同一个集合,就会有可能引发ConcurrentModificationException异常,这时就涉及到了Java迭代器中的fast-fail错误检测机制。 应对fast-fail机制,我们需要深入理解fast-fail原理与应用,掌握迭代器的迭代状态与删除操作,以及合…

    Java 2023年5月25日
    00
  • Mybatis实现动态增删改查功能的示例代码

    让我们来详细讲解”Mybatis实现动态增删改查功能的示例代码”的完整攻略吧。 1. 引入Mybatis-Plus依赖 首先,我们需要在项目中引入Mybatis-Plus的依赖。在pom.xml文件中添加以下内容: <dependency> <groupId>com.baomidou</groupId> <artif…

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