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

posted @ 2019-10-10 22:59  一首简单的歌  阅读(162)  评论(0编辑  收藏  举报