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
    步骤全部准备完毕,进行业务处理

  • 相关阅读:
    呕心沥血写的python猜数字
    判断Python输入是否为数字
    python深拷贝和浅拷贝
    python 字符串
    python字符串操作
    如何在CentOS 7.1中安装VMware Workstation
    Ubuntu强制卸载VMware-player
    linux下安装VMware出错:Gtk-Message: Failed to load module "canberra-gtk-module"解决方法
    day63 Pyhton 框架Django 06
    day62 Pyhton 框架Django 05
  • 原文地址:https://www.cnblogs.com/silenceshining/p/11651222.html
Copyright © 2011-2022 走看看