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日

相关文章

  • JSP教程(六)-怎么在JSP中跳转到别一页面

    下面是关于在JSP页面中跳转到另一页面的完整攻略。 1. 使用HTML的超链接 在JSP页面中跳转到另一个页面可以使用HTML的超链接。在a标签中使用href属性来指定目标页面的URL,例如: <a href="target.jsp">跳转到目标页面</a> 当用户单击链接时,就会跳转到目标页面。注意,这种方式的跳…

    Java 2023年6月15日
    00
  • java输出镂空金字塔实现案例

    下面是实现java输出镂空金字塔的完整攻略。 需求说明 我们需要实现一个程序,能够打印出指定层数的镂空金字塔。例如,当我们指定金字塔总层数为5时,程序应该输出如下图所示的镂空金字塔: * * * * * * * * * * * * * * * * * * * * * * * * 实现步骤 确定金字塔的总层数n,同时计算出金字塔每一层的空格数和星号数。空格数的…

    Java 2023年5月26日
    00
  • Java连接数据库oracle中文乱码解决方案

    下面是关于Java连接数据库Oracle中文乱码解决方案的攻略,分为以下几个步骤: 1. 确定数据库字符集和Java字符集 在连接Oracle数据库前,首先需要确定Oracle数据库的字符集和Java程序的字符集是否一致。可以通过以下方式来确认: 查看Oracle数据库字符集 在Oracle数据库中执行以下SQL语句来查看数据库的字符集: SELECT * …

    Java 2023年5月20日
    00
  • Spring注解实现Bean自动装配示例详解

    让我详细为您讲解一下 “Spring注解实现Bean自动装配示例详解”: 什么是Bean自动装配 在Spring中,Bean自动装配是指Spring容器在启动时,自动将需要相互依赖的实例进行自动匹配,并完成相应的依赖注入,从而简化开发工作。 在日常开发中,关于Bean自动装配,Spring提供了三种实现方式: 基于XML配置文件的方式DI 基于Java配置类…

    Java 2023年5月31日
    00
  • C#实现异步GET的方法

    针对C#实现异步GET的方法,我们可以参考以下步骤: 第一步:创建HttpClient对象 在C#中实现异步GET请求,我们需要使用HttpClient对象。HttpClient对象是一个可以发送和接收HTTP请求和响应的类,可以在.NET Framework 4.5及更高版本和.NET Core中使用。 我们可以通过以下代码创建一个HttpClient对象…

    Java 2023年5月19日
    00
  • java String 可变性的分析

    Java中的String是一个不可变的类,这意味着一旦字符串创建了,就不能更改它的值。然而,在Java的StringBuilder和StringBuffer类中,字符串可变,可以通过追加和插入操作修改现有字符串。本篇攻略将通过示例说明String可变性的特性,帮助读者全面了解String的可变性。 String是不可变的 我们可以使用下面的代码来证明Stri…

    Java 2023年5月27日
    00
  • asp.net中利用Jquery+Ajax+Json实现无刷新分页的实例代码

    首先我们需要了解一下如何在ASP.NET中使用jQuery和AJAX。在ASP.NET中,我们可以使用JavaScriptSerializer对象将对象序列化为JSON格式,然后将其返回给客户端。 以下是实现无刷新分页的详细流程和实例代码: 第一步:添加必要的JavaScript库 我们需要在网站中添加jQuery和Ajax的库文件。可以手动下载这些库文件并…

    Java 2023年5月19日
    00
  • struts2中通过json传值解决乱码问题的实现方法

    下面我将详细讲解一下在Struts2中如何通过JSON传值解决乱码问题的具体实现方法。 1. 出现乱码问题的原因 在Struts2使用JSON传值时出现乱码的原因,主要是因为在服务器端和客户端之间传输的中间环节中,出现了编码格式不一致的情况,导致数据在传输过程中出错。 2. 解决乱码问题的实现方法 2.1 设置JSON编码器的字符集 首先,我们需要在Stru…

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