Java中的CountDownLatch详解

Java中的CountDownLatch详解

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

一、什么是CountDownLatch?

CountDownLatch 是Java并发包中的一个工具类,用于实现线程间的等待。它允许一个或多个线程等待其他线程完成操作,然后再继续执行。CountDownLatch 的主要方法是 await()countDown(),分别用于线程等待和计数减少。

二、CountDownLatch的基本用法

在示例中,我们将展示如何使用 CountDownLatch 来实现一个主线程等待多个工作线程执行完毕后再继续执行的场景。

java 复制代码
package cn.juwatech.concurrent;

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3); // 初始化计数器为3

        Worker worker1 = new Worker(latch, "Worker-1");
        Worker worker2 = new Worker(latch, "Worker-2");
        Worker worker3 = new Worker(latch, "Worker-3");

        worker1.start();
        worker2.start();
        worker3.start();

        latch.await(); // 主线程等待所有工作线程完成

        System.out.println("All workers have finished their work.");
    }

    static class Worker extends Thread {
        private CountDownLatch latch;

        public Worker(CountDownLatch latch, String name) {
            super(name);
            this.latch = latch;
        }

        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + " is working.");
            try {
                Thread.sleep(1000); // 模拟工作耗时
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " has finished.");
            latch.countDown(); // 每个工作线程完成后计数器减一
        }
    }
}

三、代码解析

  1. main 方法中,创建了一个 CountDownLatch 实例 latch,初始计数为3。
  2. 创建了三个工作线程 Worker,每个线程在执行完模拟工作后,调用 latch.countDown() 来减少计数器。
  3. 主线程调用 latch.await() 来等待计数器归零,即所有工作线程执行完毕。
  4. 执行结果将输出所有工作线程完成后的提示信息。

四、总结

通过本文的示例,我们学习了如何利用 CountDownLatch 实现线程间的协作。它常用于多个线程之间的同步,主要用途包括等待多个子线程完成某项任务后再执行接下来的操作。

著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

相关推荐
Grey Zeng2 小时前
Java SE 25新增特性
java·jdk·jdk新特性·jdk25
雨白4 小时前
Java 线程通信基础:interrupt、wait 和 notifyAll 详解
android·java
架构师沉默8 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
Java中文社群9 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
每天进步一点_JL10 小时前
JVM 类加载:双亲委派机制
java·后端
用户2986985301411 小时前
Java HTML 转 Word 完整指南
java·后端
渣哥11 小时前
原来公平锁和非公平锁差别这么大
java
渣哥11 小时前
99% 的人没搞懂:Semaphore 到底是干啥的?
java
J2K11 小时前
JDK都25了,你还没用过ZGC?那真得补补课了
java·jvm·后端
kfyty72511 小时前
不依赖第三方,不销毁重建,loveqq 框架如何原生实现动态线程池?
java·架构