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日

相关文章

  • SpringMVC拦截器——实现登录验证拦截器的示例代码

    Spring MVC拦截器是一种常用的拦截器,它可以在请求到达Controller之前或之后进行拦截和处理。本文将详细讲解如何实现登录验证拦截器,并提供两个示例说明。 实现登录验证拦截器 在Spring MVC中,我们可以通过实现HandlerInterceptor接口来实现拦截器。下面是一个示例: public class LoginInterceptor…

    Java 2023年5月18日
    00
  • 什么是线程安全的算法?

    以下是关于线程安全的算法的完整使用攻略: 什么是线程安全的算法? 线程安全的算法是指在多线程环境下,多个线程可以同时访问算法而不会出现数据不一致或程序崩溃等问题。在线程编程中,线程安全的算法是非常重要的,因为多个线程同时访问算法,会出现线程争用的问题,导致数据不一致或程序崩溃。 如何实现线程安全的算法? 为实现线程安全的算法需要使用同步机制来保证多线程对算法…

    Java 2023年5月12日
    00
  • JVM调优的作用是什么?

    JVM调优的作用是优化Java虚拟机的性能,从而提高程序的执行效率、稳定性和可靠性等多个方面。JVM调优主要包括如下几个方面: 1. 调整JVM堆内存大小 JVM堆内存大小的设置是影响Java应用程序性能的重要因素。如果堆内存设置过小,会导致JVM频繁进行垃圾回收,降低应用性能;如果堆内存设置过大,会占用过多的物理内存资源,降低操作系统性能。因此,我们需要根…

    Java 2023年5月10日
    00
  • 黑客如何利用文件包含漏洞进行网站入侵

    黑客通过利用文件包含漏洞,可以轻松地将自己的代码注入到网站服务器中,从而实现对网站的入侵。下面是黑客会使用的一些攻击方法和技术: 使用文件包含漏洞的攻击方法 抓取页面源代码 黑客可以访问页面的URL,并使用一些指定的参数来获取页面的源代码。一旦黑客获取了页面的源代码,就可以查看其中是否存在文件包含漏洞。 判断漏洞类型 黑客可以通过分析页面源代码,判断该漏洞是…

    Java 2023年6月15日
    00
  • java中创建、写入文件的5种方式

    当我们在开发Java应用程序时,可能会遇到需要将数据写入文件的需求,本文将介绍Java中创建、写入文件的5种方式。 1. 使用FileOutputStream和BufferedOutputStream创建和写入文件 使用Java的FileOutputStream和BufferedOutputStream类,我们可以创建和写入文件: import java.i…

    Java 2023年5月19日
    00
  • Java实现排队论的原理

    Java 实现排队论的原理 什么是排队论 排队论是一种数学模型,用来研究当需求超过资源时如何最优地使用资源。排队论可以用于优化系统、服务、流程等,以保证资源利用率最高并提供最佳的服务质量。 Java 实现排队论 Java 可以通过不同的算法和库来实现排队论的模型。以下是一些常用的 Java 库和算法: 1. SimJava SimJava 是一种面向对象的、…

    Java 2023年5月18日
    00
  • springboot使用spring-data-jpa操作MySQL数据库

    下面是使用Spring Boot和Spring Data JPA操作MySQL数据库的完整攻略: 第一步:创建Spring Boot项目 我们可以使用Spring Initializr创建一个新的Spring Boot项目。在创建项目时,勾选“Spring Web”和“Spring Data JPA”两个选项,这样Spring Boot就会自动添加相关依赖。…

    Java 2023年5月20日
    00
  • Spring Data JPA 注解Entity关联关系使用详解

    Spring Data JPA 是 Spring Data 项目中处理 JPA 持久层的一种方法,它提供了很多注解和工具来简化 JPA 操作,其中 Entity 关联关系是 JPA 中的核心概念之一。本文将介绍 Spring Data JPA 中 Entity 关联关系的使用方法,主要包括关联关系的种类、注解的使用和案例演示。 关联关系种类 在 JPA 中,…

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