使用CountDownLatch实现Java中的倒计时功能

简介: 使用CountDownLatch实现Java中的倒计时功能

使用CountDownLatch实现Java中的倒计时功能

在Java中,CountDownLatch是一种同步工具类,它允许一个或多个线程等待一组事件的完成。它通过一个计数器来实现,计数器的初始值可以设置,任何在该对象上调用await()方法的线程都会阻塞,直到计数器的值变为零。

CountDownLatch的基本原理

CountDownLatch的工作原理非常简单:初始化一个给定数量的计数器,任何一个调用了await()方法的线程会阻塞等待,直到计数器的值变为零。

使用CountDownLatch实现倒计时功能

在下面的例子中,我们将演示如何使用CountDownLatch实现一个倒计时功能,其中一个主线程会等待所有的倒计时任务完成后才继续执行。

package cn.juwatech.examples;

import java.util.concurrent.CountDownLatch;

public class CountdownExample {
   

    public static void main(String[] args) throws InterruptedException {
   
        // 创建CountDownLatch对象,设置初始计数为3
        CountDownLatch latch = new CountDownLatch(3);

        // 创建并启动三个线程
        Worker worker1 = new Worker("Worker-1", latch);
        Worker worker2 = new Worker("Worker-2", latch);
        Worker worker3 = new Worker("Worker-3", latch);

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

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

        System.out.println("所有工作线程已经完成任务,主线程继续执行。");
    }

    // 定义Worker类,模拟工作线程
    static class Worker extends Thread {
   
        private final CountDownLatch latch;

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

        @Override
        public void run() {
   
            System.out.println(getName() + " 开始执行任务。");
            try {
   
                Thread.sleep(2000); // 模拟任务执行时间
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
            System.out.println(getName() + " 完成任务。");
            latch.countDown(); // 减少计数器的值
        }
    }
}

代码解释

  1. CountDownLatch的创建和初始化

    CountDownLatch latch = new CountDownLatch(3);
    

    这里创建了一个CountDownLatch对象,并设置初始计数为3,表示需要等待3个任务完成。

  2. 工作线程的定义

    static class Worker extends Thread {
         
        private final CountDownLatch latch;
    
        public Worker(String name, CountDownLatch latch) {
         
            super(name);
            this.latch = latch;
        }
    
        @Override
        public void run() {
         
            // 任务执行代码省略
            latch.countDown(); // 每个工作线程完成任务后调用countDown()方法
        }
    }
    

    模拟了三个工作线程,每个线程在完成任务后调用latch.countDown()来减少计数器的值。

  3. 主线程的等待

    latch.await();
    

    主线程调用await()方法来等待所有工作线程完成任务,只有当计数器的值为零时,主线程才会继续执行。

适用场景

CountDownLatch适用于一些需要等待其他线程完成某个动作后再继续执行的场景,比如多个线程同时初始化完成后再执行后续操作,或者主线程等待多个并行任务完成后再汇总结果等。

总结

本文详细介绍了如何使用Java中的CountDownLatch实现倒计时功能。通过CountDownLatch,可以方便地控制多个线程之间的协作,实现复杂的同步操作。希望本文能帮助您理解CountDownLatch的基本原理和使用方法,以及在实际开发中如何合理地应用它来解决并发问题。

相关文章
|
17天前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
99 60
|
6天前
|
Java
Java之CountDownLatch原理浅析
本文介绍了Java并发工具类`CountDownLatch`的使用方法、原理及其与`Thread.join()`的区别。`CountDownLatch`通过构造函数接收一个整数参数作为计数器,调用`countDown`方法减少计数,`await`方法会阻塞当前线程,直到计数为零。文章还详细解析了其内部机制,包括初始化、`countDown`和`await`方法的工作原理,并给出了一个游戏加载场景的示例代码。
Java之CountDownLatch原理浅析
|
2月前
|
算法 Java
JAVA并发编程系列(8)CountDownLatch核心原理
面试中的编程题目“模拟拼团”,我们通过使用CountDownLatch来实现多线程条件下的拼团逻辑。此外,深入解析了CountDownLatch的核心原理及其内部实现机制,特别是`await()`方法的具体工作流程。通过详细分析源码与内部结构,帮助读者更好地理解并发编程的关键概念。
|
5天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
11 2
|
28天前
|
Java 程序员
在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。
【10月更文挑战第13天】在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。本文介绍了Java关键字的基本概念及其重要性,并通过定义类和对象、控制流程、访问修饰符等示例,展示了关键字的实际应用。掌握这些关键字,是成为优秀Java程序员的基础。
22 3
|
26天前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
57 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
1月前
|
机器学习/深度学习 算法 Java
通过 Java Vector API 利用 SIMD 的强大功能
通过 Java Vector API 利用 SIMD 的强大功能
37 10
|
1月前
|
Oracle 安全 Java
Java 22 为开发人员带来了重大增强功能
Java 22 为开发人员带来了重大增强功能
36 9
|
1月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
24 1