线程同步之countDownLatch

Posted 好大的月亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程同步之countDownLatch相关的知识,希望对你有一定的参考价值。

场景

有时间在主线程中开启了多线程后,主线程需要等所有线程执行完毕才能return,这个时候就需要在return前拦一下,直到所有线程执行完毕。

或者,某些场景下需要多个线程同一时间执行,需要在起步的时候统一拦一下,然后收到通知再运行。

java.util.concurrent.CountDownLatch就能实现我们上面的这些需求。

CountDownLatch

CountDownLatch是通过一个计数器来实现的,计数器的初始化值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已完成任务,然后在闭锁上等待的线程就可以恢复执行任务

代码demo

直接上demo把。

主线程等待多线程完成后返回

CountDownLatch countDownLatch = new CountDownLatch(5);


for (int i = 0; i < 5; i++) 
    new Thread(() -> 
        String name = Thread.currentThread().getName();
        System.out.println(name + "等待5秒" + LocalDateTime.now());
        try 
            Thread.sleep(5000);
         catch (InterruptedException e) 
            throw new RuntimeException(e);
        
        System.out.println(name + "扣减1" + LocalDateTime.now());
        countDownLatch.countDown();
    ).start();


try 
    countDownLatch.await();
 catch (InterruptedException e) 
    throw new RuntimeException(e);

System.out.println("finish");

执行结果

让所有线程同一时间执行

CountDownLatch countDownLatch = new CountDownLatch(1);


for (int i = 0; i < 5; i++) 
       new Thread(() -> 
           String name = Thread.currentThread().getName();

           try 
               System.out.println(name + "准备" + LocalDateTime.now());
               countDownLatch.await();
               System.out.println(name + "完成" + LocalDateTime.now());
            catch (InterruptedException e) 
               throw new RuntimeException(e);
           

       ).start();




try 
    Thread.sleep(5000);

    System.out.println("link start");
 catch (InterruptedException e) 
    throw new RuntimeException(e);

countDownLatch.countDown();

执行结果

以上是关于线程同步之countDownLatch的主要内容,如果未能解决你的问题,请参考以下文章

并发编程-AQS同步组件之CountDownLatch 闭锁

java并发之同步辅助类CountDownLatch

JUC - 多线程之同步辅助CountDownLatch,CyclicBarrier,Semaphore

Java并发之CountDownLatch

源码分析:CountDownLatch 之倒计时门栓

JUC系列LOCK框架系列之三 同步工具类 CountDownLatch