一、什么是倒计时锁
CountDownLatch倒计时锁特别适合”总-分任务”,例如多线程计算后的数据汇总
CountDownLatch类位于java.util.concurrent(J.U.C)包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他3个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。
二、执行原理
image.png
通俗的来讲先定义一个初始量,如CountDownLatch=3,定义之后,主线程会进入到阻塞状态,每当线程执行一次任务之后,便会进行递减一次定义的初始值的操作,当定义的初始值为0时,便会唤醒主线程,进行执行。
三、代码示例
package com.caiweiwei.lianxi.controller; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CountDownSample { private static int count=0; public static void main(String[] args) { ExecutorService executorService= Executors.newFixedThreadPool(100); CountDownLatch countDownLatch=new CountDownLatch(1000);//CDL总数和操作数保持一致 for (int i=1;i<=1000;i++){ final int index=i; executorService.execute(new Runnable() { @Override public void run() { synchronized (CountDownSample.class){ try{ count = count + index; }catch (Exception e){ e.printStackTrace(); }finally { //计数器减一 countDownLatch.countDown(); } } } }); } try{ countDownLatch.await();//堵塞当前线程,知道cdl=0的时候再继续往下走 }catch (Exception e){ e.printStackTrace(); } System.out.println(count); executorService.shutdown(); } }