JAVA CountDownLatch(倒计时计数器)用法实例

JAVA CountDownLatch(倒计时计数器)用法实例

什么是 CountDownLatch

CountDownLatch(倒计时计数器)是 Java 提供的一个同步工具类,通过它可以让一个或多个线程等待其它线程完成各自的工作后再继续执行。

在 CountDownLatch 中,我们可以设置一个计数器的初始值 n,然后调用 countDown() 方法表示这个计数器值减 1,调用 await() 方法表示等待计数器达到 0。

使用 CountDownLatch 可以在主线程等待多个线程执行完毕后再继续执行,或者在多个线程等待某个线程完成任务后再继续执行。

CountDownLatch 示例

示例 1:主线程等待多个线程执行完毕

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        int numOfThreads = 5;
        CountDownLatch countDownLatch = new CountDownLatch(numOfThreads);
        for (int i = 0; i < numOfThreads; i++) {
            Thread t = new WorkerThread(countDownLatch, i);
            t.start();
        }
        countDownLatch.await();
        System.out.println("All threads have finished executing.");
    }

    private static class WorkerThread extends Thread {
        private final CountDownLatch countDownLatch;
        private final int threadId;

        public WorkerThread(CountDownLatch countDownLatch, int threadId) {
            this.countDownLatch = countDownLatch;
            this.threadId = threadId;
        }

        @Override
        public void run() {
            try {
                System.out.println("Thread " + threadId + " is running.");
                Thread.sleep(1000);
                System.out.println("Thread " + threadId + " has finished executing.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                countDownLatch.countDown();
            }
        }
    }
}

在这个示例中,我们通过 CountDownLatch 让主线程等待 5 个子线程执行完毕后再继续执行。每个子线程运行时休眠 1 秒钟,表示它们正在执行某些操作,然后通过 countDown() 方法将计数器减 1。当计数器减到 0 时,主线程中的 await() 方法将返回,表示所有子线程已经执行完毕。

输出结果如下:

Thread 0 is running.
Thread 1 is running.
Thread 2 is running.
Thread 3 is running.
Thread 4 is running.
Thread 1 has finished executing.
Thread 2 has finished executing.
Thread 0 has finished executing.
Thread 3 has finished executing.
Thread 4 has finished executing.
All threads have finished executing.

示例 2:多个线程等待某个线程完成任务后继续执行

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        int numOfThreads = 3;
        CountDownLatch countDownLatch = new CountDownLatch(1);
        for (int i = 0; i < numOfThreads; i++) {
            Thread t = new WaiterThread(countDownLatch, i);
            t.start();
        }
        Thread.sleep(3000);
        countDownLatch.countDown();
    }

    private static class WaiterThread extends Thread {
        private final CountDownLatch countDownLatch;
        private final int threadId;

        public WaiterThread(CountDownLatch countDownLatch, int threadId) {
            this.countDownLatch = countDownLatch;
            this.threadId = threadId;
        }

        @Override
        public void run() {
            try {
                System.out.println("Thread " + threadId + " is waiting.");
                countDownLatch.await();
                System.out.println("Thread " + threadId + " has resumed execution.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在这个示例中,我们通过 CountDownLatch 让 3 个子线程等待某个线程完成任务后再继续执行。主线程休眠 3 秒钟,模拟某个需要 3 秒钟才能完成的任务,然后通过 countDown() 方法将计数器减 1。此时由于计数器已经为 0,所有在调用 await() 的子线程都将恢复执行。

输出结果如下:

Thread 1 is waiting.
Thread 0 is waiting.
Thread 2 is waiting.
Thread 0 has resumed execution.
Thread 2 has resumed execution.
Thread 1 has resumed execution.

总结

CountDownLatch 是一个非常实用的同步工具,它可以让我们在多线程编程中更为便捷地实现并发控制。在实际应用中,我们可以根据具体的需求来灵活地使用 CountDownLatch,实现不同的并发控制场景。以上是两个使用 CountDownLatch 的实例,希望能够对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA CountDownLatch(倒计时计数器)用法实例 - Python技术站

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

相关文章

  • Spring MVC整合FreeMarker的示例

    针对Spring MVC整合FreeMarker的示例,我将给出完整的攻略,包含以下内容: 环境准备 配置FreeMarker 编写Controller 编写FreeMarker模板 示例演示 下面我们详细讲解每一项内容。 环境准备 首先需要准备好环境。在本示例中,我们将使用以下环境: JDK 8 Maven 3 Spring 5 FreeMarker 2.…

    Java 2023年5月19日
    00
  • java实现建造者模式(Builder Pattern)

    下面我就详细讲解一下“Java实现建造者模式(Builder Pattern)”的完整攻略。 什么是建造者模式? 建造者模式是一种对象创建型设计模式,它允许你创建不同风格的对象,同时避免构造器污染问题。在该模式中,我们将构造过程分步进行,使得在创建对象时能够更加灵活地控制每个构造步骤,从而创建不同类型的对象。 建造者模式的角色 建造者模式中有以下几个角色: …

    Java 2023年5月18日
    00
  • java垃圾回收原理之GC算法基础

    Java垃圾回收原理之GC算法基础 垃圾回收是Java的一项基本功能,它帮助程序员释放不再使用的内存。Java中的垃圾回收器使用了多种垃圾回收算法。GC算法的选择和调优对程序的性能有很大的影响。为了更好的理解Java中的GC算法,我们需要首先掌握垃圾的判定方法和垃圾回收算法的分类。 垃圾回收 Java 中的垃圾回收主要是通过判断对象是否还有引用指向来进行判定…

    Java 2023年5月26日
    00
  • map实现按value升序排序

    要实现map按 value 升序排序,可以借助 C++ 中的 STL 库中的 sort() 函数来实现。 具体步骤如下: 将map的键值对推入到一个vector中。 通过 sort() 函数对vector中的元素按照关键字升序排序。 将排序后的向量元素重新填充到map中。 以下是详细的代码实现: #include <iostream> #incl…

    Java 2023年5月19日
    00
  • Java获取接口所有实现类的方式详解

    关于Java获取接口所有实现类的方式,可以采用以下三种方法: 方法一:利用Java SPI机制 Java SPI(Service Provider Interface)即服务提供商接口,是Java标准类库中的一种服务提供发现机制。利用Java SPI机制,我们可以很容易地获取到某个接口的所有实现类。具体操作步骤如下: 定义接口MyService: java …

    Java 2023年5月19日
    00
  • 聊聊SpringBoot自动装配的魔力

    我来为你讲解一下关于“聊聊SpringBoot自动装配的魔力”的攻略。 什么是SpringBoot自动装配? Spring Boot是一个约定大于配置的框架,它大量使用自动配置来简化应用程序的开发。Spring Boot自动配置模块为Spring框架提供了很多自动检测和自动配置的功能,使得开发者可以专注于业务逻辑的开发而不需要过多关注底层技术的实现。 Spr…

    Java 2023年5月19日
    00
  • Java Spring Boot 集成Zookeeper

    Java Spring Boot 集成 Zookeeper Zookeeper是一个分布式协调服务,它可以用于管理和协调分布式应用程序。在本文中,我们将详细讲解如何在Java Spring Boot应用程序中集成Zookeeper,包括如何安装和配置Zookeeper,如何使用Zookeeper进行服务发现和配置管理等。 安装和配置Zookeeper 在使用…

    Java 2023年5月15日
    00
  • jsp编程常用技巧小结

    JSP编程常用技巧小结 1. 使用 EL 表达式简化页面逻辑 使用 EL(表达式语言) 可以让我们在 JSP 页面上通过简单的语法实现对页面数据的操作。例如,我们可以在页面上直接输出 JavaBean 对象的属性值,或者进行简单的逻辑操作。 <p>当前用户是:${sessionScope.user.username}</p> <…

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