java使用CountDownLatch等待多线程全部执行完成

 更新时间:2018年10月15日 15:35:09   作者:张小鸣  
这篇文章主要为大家详细介绍了使用CountDownLatch等待多线程全部执行完成,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

CountDownLatch 允许一个或多个线程等待其他线程完成操作。

应用场景

假如有一个列表的大量数据等待处理,最后全部处理完毕后返回处理结果。普通做法就是从头遍历,一个个顺序执行,这样单线程处理效率不高,我们希望使用多线程的方式处理,同时在主线程等待所有子线程处理完成。

CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。
当我们调用一次CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await会阻塞当前线程,直到N变成零。由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里的N个执行步骤。用在多个线程时,你只需要把这个CountDownLatch的引用传递到线程里。

示例代码

public static void main(String args[]){
  //初始化计数
  AtomicInteger count = new AtomicInteger(0);
  //创建10个线程
  ExecutorService executorService = Executors.newFixedThreadPool(10);
  //设置CountDownLatch为10
  CountDownLatch countDownLatch = new CountDownLatch(10);
  for(int i=0;i<10;i++){
   executorService.execute(() -> {
    //每个线程累加10000次
    for(int j=0;j<10000;j++){
     count.addAndGet(1);
    }
    //线程最后执行countDown
    countDownLatch.countDown();
   });
  }
  try{
   //调用await方法等待
   countDownLatch.await();
  }catch(Exception e){
   e.printStackTrace();
  }
  System.out.println(count.toString());
 }

最后的执行结果就是10*10000=100000,可见所有线程都处理完了。

扩展

CountDownLatch的await方法还支持超时时间的设置,当等待超时时间子线程还没执行完将不再等待继续执行主线程。

public boolean await(long timeout, TimeUnit unit)

熟练使用多线程处理,可以再处理大量重复性工作时发挥多线程处理的效率优势。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 在es中查询null值的操作方法

    在es中查询null值的操作方法

    在我们向es中写入数据时,有些时候数据写入到es中的是null,或者没有写入这个字段,那么这个时候在es中该如何查询出这种为null的数据呢,本文给大家详细讲解,需要的朋友参考下吧
    2023-02-02
  • Spring Boot邮箱链接注册验证及注册流程

    Spring Boot邮箱链接注册验证及注册流程

    这篇文章给大家介绍Spring Boot邮箱链接注册验证问题及注册流程分析,通过实例代码给大家分享实现过程,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • 三种Java自定义DNS解析器方法与实践

    三种Java自定义DNS解析器方法与实践

    这篇文章主要分享三种Java自定义DNS解析器方法与实践,对于高性能的测试机(54C96G * 3)而言,可任意通过自定义Java DNS解析器来实现接口请求,下文内容的实现,需要的小伙伴可以参考一下
    2022-02-02
  • SpringBoot下RabbitMq实现定时任务

    SpringBoot下RabbitMq实现定时任务

    这篇文章主要为大家详细介绍了SpringBoot下RabbitMq实现定时任务,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Spring详细讲解FactoryBean接口的使用

    Spring详细讲解FactoryBean接口的使用

    这篇文章主要为大家介绍了Spring容器FactoryBean工厂实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Java自带消息队列Queue的使用教程详细讲解

    Java自带消息队列Queue的使用教程详细讲解

    这篇文章主要介绍了Java自带消息队列Queue的使用教程,Java中的queue类是队列数据结构管理类,在它里边的元素可以按照添加它们的相同顺序被移除,队列通常以FIFO的方式排序各个元素,感兴趣想要详细了解可以参考下文
    2023-05-05
  • 最常用的1000个Java类(附代码示例)

    最常用的1000个Java类(附代码示例)

    这篇文章主要介绍了最常用的1000个Java类(附代码示例),需要的朋友可以参考下
    2015-04-04
  • 2020版IDEA整合GitHub的方法详解

    2020版IDEA整合GitHub的方法详解

    这篇文章主要介绍了2020版IDEA整合GitHub的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • springboot指定profiles启动失败问题及解决

    springboot指定profiles启动失败问题及解决

    这篇文章主要介绍了springboot指定profiles启动失败问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • java 文件目录读写删除操作详细实现代码

    java 文件目录读写删除操作详细实现代码

    这篇文章主要介绍了java 文件读写删操作详细实现代码,需要的朋友可以参考下
    2017-09-09

最新评论