线程同步之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 闭锁