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 Bean 作用域及它的几种类型介绍

    Java Bean 作用域及它的几种类型介绍 什么是 Java Bean Java Bean 是一种特殊的 Java 类,它具有无参构造器、私有属性和公共 setter/getter 方法,以封装数据,并提供给其他对象使用。Java Bean 通常被用于简化 Java 应用程序的开发过程,也可以用于在不同的设备和应用程序之间传输数据。在 Java Web 应…

    Java 2023年5月26日
    00
  • IE cache缓存 所带来的问题收藏

    IE cache缓存所带来的问题 什么是IE cache缓存? IE cache缓存是指Internet Explorer浏览器在浏览网页过程中自动缓存的网页文件,包括了html网页文件、js和css等其他资源文件,以让用户在下次访问同一网页时更快地加载页面和资源,提升用户体验。 IE cache缓存带来的问题 尽管IE cache缓存可以提升用户体验,但是…

    Java 2023年6月15日
    00
  • Spring占位符Placeholder的实现原理解析

    Spring占位符Placeholder的实现原理解析 在Spring中,占位符(Placeholder)是一个非常实用的功能,它可以在Spring容器启动时通过配置文件或环境变量等方式注入需要的配置值。本文将详细讲解Spring占位符的实现原理。 占位符的使用 在Spring中,占位符有两种使用方式:XML配置方式和注解方式。 XML配置方式 在XML配置…

    Java 2023年5月31日
    00
  • java多线程之线程安全的单例模式

    Java中的单例模式是指某个类只有一个实例,并提供全局访问点。在多线程的环境下,单例模式需要控制并发访问下的线程安全。下面我们来详细讲解“Java多线程之线程安全的单例模式”的完整攻略。 线程安全的单例模式 线程安全的单例模式可以通过同步方法或同步块来实现。下面是一个使用同步方法实现线程安全单例模式的示例。 public class Singleton { …

    Java 2023年5月18日
    00
  • Java中static变量能继承吗

    Java中的static变量是类级别的变量,即使类还没有实例化,它也已经存在了。因此,它的值对于类中定义的所有方法和对象实例是相同的。那么,Java中的static变量能否被继承呢?答案是可以。 当一个子类继承一个父类时,它包含了父类的所有非私有成员变量和方法。这些变量和方法可以被直接访问,但是对于static变量,Java有一些额外的规则需要遵循。下面通过…

    Java 2023年5月26日
    00
  • Java开发环境配置教程(win7 64bit)

    Java开发环境配置教程(win7 64bit) 下载JDK安装包 首先需要进入Oracle官网下载JDK安装包,进入https://www.oracle.com/java/technologies/javase-downloads.html进行下载。 安装JDK及设置环境变量 安装JDK之前需要检查系统是否已安装Java(JRE)。如果已经安装,需要先卸载…

    Java 2023年5月23日
    00
  • Mybatis各种查询接口使用详解

    Mybatis各种查询接口使用详解 Mybatis是一款优秀的持久层框架,提供了不同的查询接口来满足各种复杂查询需求。本文将详细讲解Mybatis各种查询接口的使用方法。 基本查询 select 使用select查询数据非常简单,只需要在Mapper接口定义对应的方法,返回值为查询结果即可。 <!– Mapper.xml –> <sel…

    Java 2023年5月19日
    00
  • Spring MVC实现mysql数据库增删改查完整实例

    以下是关于“Spring MVC实现MySQL数据库增删改查完整实例”的完整攻略,其中包含两个示例。 Spring MVC实现MySQL数据库增删改查完整实例 在Spring MVC中,我们可以使用JdbcTemplate类来实现MySQL数据库的增删改查操作。在本文中,我们将讲解如何使用JdbcTemplate类来实现MySQL数据库的增删改查操作。 My…

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