Java多线程同步工具类CountDownLatch详解

Java多线程同步工具类CountDownLatch详解

CountDownLatch是Java多线程中的一个同步工具类,它可以让一个或多个线程等待一组事件完成后再执行。

基本使用

CountDownLatch的基本使用场景是:在多个线程执行时,有一个或多个线程需要等待其他线程都完成任务后再继续执行。这时候可以使用CountDownLatch来实现。

在使用CountDownLatch时,首先需要创建CountDownLatch对象,设置计数器为需要等待的线程数量。当每个线程执行完任务后都会调用CountDownLatch对象的countDown()方法,将计数器减1。当计数器为0时,等待中的线程就会被唤醒,继续执行。

示例代码如下:

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        int threadNum = 3;
        CountDownLatch latch = new CountDownLatch(threadNum);

        for (int i = 0; i < threadNum; i++) {
            new Thread(() -> {
                try {
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName() + " 执行完毕");
                    latch.countDown();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }

        latch.await();
        System.out.println("所有线程执行完毕");
    }
}

在这个例子中,我们创建了一个计数器为3的CountDownLatch对象,表示等待3个线程执行完毕后再继续执行。

我们在for循环中创建了3个线程,每个线程执行完任务后都会调用latch.countDown()方法。最后我们调用latch.await()方法,等待所有线程执行完毕。当所有计数器都被减为0时,等待中的线程就会被唤醒,继续执行。最后输出“所有线程执行完毕”。

高级使用

除了基本使用场景外,CountDownLatch还可以用来解决更为复杂的问题。例如,我们需要等待多个线程完成不同的任务后再执行。这时候可以使用CountDownLatch的多次countDown()方法来实现。

示例代码如下:

public class CountDownLatchExample2 {
    public static void main(String[] args) throws InterruptedException {
        int taskNum = 3;
        CountDownLatch totalLatch = new CountDownLatch(taskNum);

        CountDownLatch task1Latch = new CountDownLatch(1);
        CountDownLatch task2Latch = new CountDownLatch(1);
        CountDownLatch task3Latch = new CountDownLatch(1);

        new Thread(() -> {
            try {
                task1();
                task1Latch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            totalLatch.countDown();
        }).start();

        new Thread(() -> {
            try {
                task2();
                task2Latch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            totalLatch.countDown();
        }).start();

        new Thread(() -> {
            try {
                task3();
                task3Latch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            totalLatch.countDown();
        }).start();

        task1Latch.await();
        task2Latch.await();
        task3Latch.await();
        System.out.println("所有任务执行完毕");
    }

    private static void task1() throws InterruptedException {
        Thread.sleep(3000);
        System.out.println("任务1执行完毕");
    }

    private static void task2() throws InterruptedException {
        Thread.sleep(2000);
        System.out.println("任务2执行完毕");
    }

    private static void task3() throws InterruptedException {
        Thread.sleep(1000);
        System.out.println("任务3执行完毕");
    }
}

在这个例子中,我们创建了一个计数器为3的CountDownLatch对象totalLatch,表示等待3个任务执行完毕后再继续执行。

我们还创建了3个单独的CountDownLatch对象task1Latch、task2Latch和task3Latch,用来分别等待任务1、任务2和任务3执行完毕。

我们创建了3个线程来执行这3个任务。当每个线程执行完任务后都会调用totalLatch.countDown()方法,将总的计数器减1。当所有任务执行完毕后,totalLatch计数器为0,等待中的线程就会被唤醒,继续执行。

最后我们等待每个任务的计数器都减为0(任务1、任务2和任务3分别对应task1Latch、task2Latch和task3Latch),然后输出“所有任务执行完毕”。

这是CountDownLatch的高级使用,可以灵活应用在各种多线程场景中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程同步工具类CountDownLatch详解 - Python技术站

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

相关文章

  • Java 实现Redis存储复杂json格式数据并返回给前端

    实现Redis存储复杂json格式数据并返回给前端需要经过以下步骤: 1. 安装Redis和Java Redis客户端 Redis可以在官网下载最新版的安装文件,Redis的Java客户端可以使用Jedis和Lettuce。 2. 创建Java Redis连接 使用Jedis或Lettuce,创建Redis连接对象,连接Redis数据库,并获取Redis的操…

    Java 2023年5月26日
    00
  • 使用Netty进行编解码的操作过程详解

    使用Netty进行编解码是网络编程中的一个重要的环节。下面我将详细讲解使用Netty进行编解码的操作过程,并且提供两个示例。 Netty编解码的操作过程 第一步:定义消息实体类(Message) 在进行Netty编解码的操作之前,我们需要定义一个消息实体类(Message),该实体类需要实现Serializable接口。代码示例如下: public clas…

    Java 2023年5月20日
    00
  • Spring Security 中细化权限粒度的方法

    那么接下来我将详细讲解Spring Security中细化权限粒度的方法的完整攻略。 什么是Spring Security? Spring Security是一个基于Spring框架的安全性解决方案,旨在为企业Java应用程序提供权威的身份验证和授权支持。 Spring Security中如何细化权限粒度? 1. 使用注解来限制访问 在Spring Secu…

    Java 2023年5月20日
    00
  • SpringBoot项目中新增脱敏功能的实例代码

    当我们处理用户的敏感数据时,为了保护用户的隐私,我们通常需要对这些数据进行脱敏处理,例如隐藏电话号码中的部分数字、删除姓名中间的一部分字母等等。本文将介绍在SpringBoot项目中新增脱敏功能的实例代码,帮助开发者更好地保护用户隐私。 实现思路 实现脱敏功能的主要思路是通过正则表达式对敏感数据进行替换,将一些敏感信息用星号或其他字符替换掉,以此达到脱敏的目…

    Java 2023年5月23日
    00
  • 浅谈java中字符串数组、字符串、整形之间的转换

    浅谈Java中字符串数组、字符串、整形之间的转换 在Java开发中,字符串数组、字符串和整形的相互转换是非常常见的操作。本攻略将详细介绍不同类型的数据之间的转换方法。 字符串数组和字符串的转换 将字符串数组转换为字符串 我们可以使用Java提供的String.join()方法将字符串数组转换成一个字符串。该方法将数组元素连接为一个字符串,每个元素之间插入指定…

    Java 2023年5月26日
    00
  • Spring 实现数据库读写分离的示例

    Spring 实现数据库读写分离的完整攻略 什么是数据库读写分离? 数据库读写分离(Database Read-Write Separation),简称DB读写分离,是将数据库的读操作和写操作分开,将读操作集中到一个或多个只读数据库节点上,将写操作集中到一个或多个主数据库节点上,从而达到提高数据库性能和扩展能力的目的。读写分离是一种常见的数据库架构和优化方案…

    Java 2023年5月20日
    00
  • Spring JdbcTemplate实现添加与查询方法详解

    我们来详细讲解一下“Spring JdbcTemplate实现添加与查询方法详解”的完整攻略。 一、什么是JdbcTemplate? JdbcTemplate是Spring框架中用来简化JDBC访问的类,通过JdbcTemplate可以简单而且明了地编写JDBC相关代码。相对于纯JDBC,JdbcTemplate有以下优势: JdbcTemplate回调函数…

    Java 2023年5月20日
    00
  • SpringBoot配置及使用Schedule过程解析

    Spring Boot 配置及使用 Schedule 过程解析 在本文中,我们将深入了解 Spring Boot 中的配置和使用 Schedule 的过程。我们将介绍 Spring Boot 的配置文件、配置属性、配置注解以及如何使用 Schedule 定时任务。 Spring Boot 配置文件 Spring Boot 的配置文件是一个名为 applica…

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