zoukankan      html  css  js  c++  java
  • CountDownLatch使用

    CountDownLatch可以应用于等待多个线程执行完毕后,再执行剩余逻辑,下面举例说明。

    场景:程序启动后有三个初始化启动步骤,都是耗时操作,如果单线程顺序执行的话比较耗时,且各步骤的执行无关联,此时考虑多个线程同时进行初始化,但要保证程序业务逻辑的执行要在3个初始化完成之后,应用CountDownLatch可达到此效果,初始化CountDownLatch时构造函数传入3,每个线程执行完时CountDownLatch执行countDown方法,进行减1操作,这样当3个线程都执行完后,countDownLatch.await();后的代码才得以执行,达到效果(相当于在多线程环境下达到顺序执行的效果)。代码示例如下:

    package current;
    
    import java.util.concurrent.CountDownLatch;
    
    public class CountDownLatchTest {
    
        public static void main(String[] args) {
            CountDownLatch countDownLatch = new CountDownLatch(3);
            // 线程1:进行程序启动的准备步骤1
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(5000);
                        System.out.println("完成准备步骤1");
                        countDownLatch.countDown();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
            // 线程2:进行程序启动的准备步骤2
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(10000);
                        System.out.println("完成准备步骤2");
                        countDownLatch.countDown();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
            // 线程3:进行程序启动的准备步骤3
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(5000);
                        System.out.println("完成准备步骤3");
                        countDownLatch.countDown();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
    
            System.out.println("开始程序启动的准备步骤");
            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("步骤全部准备完毕,进行业务处理");
    
        }
    
    }

    执行结果为:

    开始程序启动的准备步骤
    完成准备步骤1
    完成准备步骤3
    完成准备步骤2
    步骤全部准备完毕,进行业务处理

  • 相关阅读:
    记RestTemplate远程请求接口数据的一些注意事项
    记使用SpringDataMongonDb时,dao方法命名的一个已解决但不知道为什么的bug
    charles 打断点后传参或返回数据更改
    在liunx上搭建git仓库1
    jsonpath 提取参数
    pytest 参数化的使用1
    pytest中断言失败后,也可以继续执行其他用例
    charles开启弱网功能
    httprunner 参数化
    httprunner中debugtalk使用
  • 原文地址:https://www.cnblogs.com/silenceshining/p/11651222.html
Copyright © 2011-2022 走看看