美文网首页
CountDownLatch

CountDownLatch

作者: 得力小泡泡 | 来源:发表于2021-01-13 18:36 被阅读0次

    1、背景

    一个平常面试高频次会被提及的东东,属于线程之间的一种通信问题。

    这里先提一个问题:有两个线程,第一个线程需要等待第二个线程执行完所有的任务之后,第一个线程才能继续执行,那咱们可以使用线程中的哪个机制能实现呢?很显然利用Thread.join()方法。但是还有一种场景是用Thread.join()解决不了的。

    2、CountDownLatch使用情景

    该情景是:启动了一个主服务,然后它下面会启动五个子服务,而当五个子服务都执行到一半的逻辑时【或者是特定条件成立时】则通知主服务可以继续往下执行了,而五个子服务没有执行到一半完成之前主服务只能等待。很明显这种业务场景用Thread.join()是没法实现的,因为join()是一定要等待指定线程都执行消亡了调用方才能继续往下执行

    例子:

    import java.util.concurrent.CountDownLatch;
    import java.util.stream.IntStream;
    
    public class MyTest1 {
        public static void main(String[] args) {
            CountDownLatch countDownLatch = new CountDownLatch(3);
    
            IntStream.range(0, 3).forEach(i -> new Thread(() -> {
                try {
                    Thread.sleep(2000);
    
                    System.out.println("hello");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    countDownLatch.countDown();
                }
            }).start());
    
            System.out.println("启动子线程完毕!");
    
            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            System.out.println("主线程执行完毕!");
        }
    }
    
    方法分析
    • 1、CountDownLatch countDownLatch = new CountDownLatch(3);
      表示记数器值count的最大大小,必须调用countDown()方法的次数才会往下执行
    • 2、public void await() throws InterruptedException { };
      调用await()方法的线程会进入阻塞队列,它会等待直到count值为0才继续执行
    • 3、public void countDown() { };
      将count值减1,计数器count减为0时则不会再发生变化了,也就是说不会再继续减成负数了
    内容分析

    创建了3个新的线程,每个线程都有各自的执行代码,CountDownLatch初始设置记数器count为3,当调用 countDownLatch.await() 方法时,需要调用3次 countDownLatch.countDown() 方法才会继续执行下去,这里充分说明了3个新的线程并不需要全部都执行完,主线程才可以继续执行,而是3个新的线程执行到一定关键位置时,觉得可以了,主线程就可以继续执行了

    输出
    启动子线程完毕!
    hello
    hello
    hello
    主线程执行完毕!
    

    相关文章

      网友评论

          本文标题:CountDownLatch

          本文链接:https://www.haomeiwen.com/subject/ijouaktx.html