【Java多线程学习3】CountDownLatch工具类学习

【Java多线程学习3】CountDownLatch工具类学习

一、什么是CountDownLatch?CountDownLatch有什么作用?

  • 1、CountDownLatch是java.util.concurrent下的一个工具类,可以将其理解为一个协调多线程执行的计数器即允许Count个线程阻塞在一个地方,直到所有的线程都执行完毕,才去执行后面的逻辑。
  • 2、当创建CountDownLatch时,需要指定计数器的初始值,表示需要等待的一组线程的数量。每当一个线程执行完毕后会调用CountDownLatch的countDown()方法来将计数器减1,当计数器减为0时,表示这组线程执行完毕,只有当线程执行完毕后,才会去执行后面的逻辑。

二、什么场景下会用到CountDownLatch?能不能整个例子说明下

比如说,我有一个网管组件,其可以给设备部署各种路由策略模板,并且一个设备模板可以部署到多个设备上。基于上述背景,我在网管应用上新增了一个模板a,并且需要将这个模板部署到十个设备上。具体代码如下:

public class practice {
    //设定要部署的设备数量devSize = 10;
    private final static int devSize = 10;

    public static void main(String[] args) throws InterruptedException {
        //此处我们通过Executor工具类先简单创建一个线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(10);

        //创建CountDownLatch计数器,表示要阻塞的线程数量,即只有当10台设备都执行完部署
        CountDownLatch count = new CountDownLatch(devSize);

        for (int i = 0; i < devSize; i++) {
            //每个设备起一个线程
            threadPool.execute(() -> {
               try {
                   //执行模板部署到单个设备的操作


               }catch (Exception e) {
                   e.printStackTrace();
               }finally {
                   //每部署完一个设备,则将线程计数器减一
                   count.countDown();

                   //方法一:所有线程都执行完任务后,即10太设备都部署完成后,再去统计模板操作结果
                   if (count.getCount() == 0) {
                       //更新模板最终部署结果,即此模板部署到10台设备上的整体结果
                   }
               }
            });
        }

        //方法二:调用CountDownLatch对象的 await()方法,直到所有文件读取完之后,才会接着执行后面的逻辑。
        count.await();
        //更新模板最终部署结果,即此模板部署到10台设备上的整体结果
    }
}

定义了一个线程池和 count 为 10 的CountDownLatch对象 。使用线程池处理读取任务,每一个线程处理完之后就将 count-1,调用CountDownLatch对象的 await()方法,直到所有文件读取完之后,才会接着执行后面的逻辑。

你可能感兴趣的:(java,多线程)