CountDownLatch是Java1.5之后引入的Java并发工具类(闭锁的一个实现),放在java.util.concurrent包下。用给定的计数初始化CountDownLatch。由于调用了countDown方法,所以在当前计数到达零之前,await方法会一直受阻塞。之后,会释放所有等待的线程,await的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用CyclicBarrier。
CountDownLatch能够使一个或多个线程等待其他线程完成各自的工作后再执行。
闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。
其他的N个线程必须引用闭锁对象,因为他们需要通知CountDownLatch对象,他们已经完成了各自的任务,这种机制就是通过countDown()方法来完成的。
CountDownLatch优点:
CountDownLatch缺点:
CountDownLatch使用场景:
CountDownLatch的主要方法:
注意:
CountDownLatch的使用示例:
public class Test { public static void main(String[] args) throws Exception { /*创建CountDownLatch实例,计数器的值初始化为5*/ final CountDownLatch downLatch = new CountDownLatch(5); /*创建三个线程,每个线程等待2s,表示执行比较耗时的任务*/ for(int i = 0;i < 5;i++){ new Thread(new Runnable() { public void run() { try { Thread.sleep(2000); System.out.println(String.format("线程%s已完成", Thread.currentThread().getName())); /*任务完成后调用CountDownLatch的countDown()方法,进行减1*/ downLatch.countDown(); }catch (InterruptedException e){ e.printStackTrace(); } } }).start(); } /*主线程调用await()方法,等到其他五个线程执行完后才继续执行*/ downLatch.await(); System.out.print("所有线程都已经执行完成,继续运行主线程逻辑"); } }
CountDownLatch方法总结:
原文:https://www.cnblogs.com/bl123/p/14166734.html