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

假如有这样一个需求:我们需要解析一个Excel里多个sheet的数据,此时可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作,最简单的做法是使用join()方法。

public class JoinCountDownLatchTest {public static void main(String[] args) throws InterruptedException {Thread parser1 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("parser1 finish");}});Thread parser2 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("parser2 finish");}});parser1.start();parser2.start();parser1.join();parser2.join();System.out.println("all parser finish");}
}
result:
parser1 finish
parser2 finish
all parser finish
主线程会等待线程1和2运行完成后再运行。

在JDK 1.5之后的并发包中提供的CountDownLatch也可以实现join的功能,并且比join的功能更多

CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。

当我们调用CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await方法
会阻塞当前线程,直到N变成零。由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里的N个执行步骤。用在多个线程时,只需要把这个CountDownLatch的引用传递到线程里即可。如果有某个线程处理得比较慢,我们不可能让主线程一直等待,所以可以使用另外一个带指定时间的await方法——await(long time,TimeUnit unit),这个方法等待特定时间后,就会不再阻塞当前线程。join也有类似的方法。

public class Test {static CountDownLatch c = new CountDownLatch(2);public static void main(String[] args) throws InterruptedException {new Thread(() -> {System.out.println("线程1运行任务1");c.countDown();System.out.println("线程1运行任务2");c.countDown();}).start();c.await();System.out.println("主线程汇聚任务");}
}
result:
线程1运行任务1
线程1运行任务2
主线程汇聚任务

注意的是:计数器必须大于等于0,只是等于0时候,计数器就是零,调用await方法时不会
阻塞当前线程。CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部计数
器的值。

转载于:https://www.cnblogs.com/keeya/p/9320981.html

Join的加强版CountDownLatch相关推荐

  1. 正月十五吃汤圆CountDownLatch

    目录 CountDownLatch实际应用 和Join比较 总结 CountDownLatch实际应用 今天是正月十五,给大家拜个晚年啦! 元宵节是中国传统节日,吃汤圆不能少啊,今天我们统计下&quo ...

  2. CountDownLatch介绍

    CountDownLatch(闭锁)是一个同步协助类,允许一个或多个线程等待,直到其他线程完成 操作集. CountDownLatch使用给定的计数值(count)初始化.await方法会阻塞直到当前 ...

  3. 无语!你竟然连CompletableFuture都不知道,还天天说在jdk8原地踏步~

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://urlify.cn/ayaMBb 这篇文章介绍 Java 8 的 CompletionStage API和它的 ...

  4. 20个使用 Java CompletableFuture的例子

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 鸟窝 来源 | https://urlify.cn/ay ...

  5. 由浅入深理解Java线程池及线程池的如何使用

    前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...

  6. 在Java中异步编程,同事非要用rxJava,被我一顿吐槽!

    在Java中异步编程,不一定非要使用rxJava, Java本身的库中的CompletableFuture可以很好的应对大部分的场景. 这篇文章介绍 Java 8 的 CompletionStage ...

  7. java并发编程之美-阅读记录10

    同步器 10.1CountDownLatch 在开发过程中经常会遇到在主线程中开启多个子线程去并行执行任务,并且主线程需要等待子线程执行完毕后在进行汇总.在CountDownLatch出现之前使用线程 ...

  8. Java线程池理解及用法

    前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...

  9. 20 个使用 Java CompletableFuture的例子

    转载自 20 个使用 Java CompletableFuture的例子 这篇文章介绍 Java 8 的 CompletionStage API和它的标准库的实现 CompletableFuture. ...

最新文章

  1. 2022-2028年中国普鲁兰多糖行业市场分析及投资前景研究报告
  2. Ado.Net 连接数据库
  3. 洛谷P1162 填涂颜色
  4. 工匠精神,缔造美国净水传奇
  5. 全球及中国石墨烯行业发展格局及投资盈利分析报告2021年版
  6. SpringMVC-注解@RequestParam
  7. ThinkPHP的增、删、改、查
  8. 16-elasticsearch6.x {“error“:“Content-Type header [application/x-www-form-urlencoded] is not support
  9. 使用OData快速构建REST服务
  10. 批量获取中国所有行政区域经边界纬度坐标(到县区级别)
  11. gophp解释器_golang底层用什么语言实现的
  12. Java类和对象之对象组合之求圆柱体积
  13. b站黑马Vue2后台管理项目笔记——(1)登录功能
  14. Java诊断工具-Arthas入门与实践
  15. 多卡聚合智能融合通信设备在智慧房车上的应用
  16. JVM如何识别“到底谁才是垃圾“?
  17. hrbust 2343 巴啦啦能量
  18. R语言实现灰色预测模型gm11
  19. 堕落之后重新开始学习
  20. FPU (1) 简介

热门文章

  1. linux系统挂载(卸载)U盘(文件系统)
  2. 工业机器人电柜布线_协作并联,重新注解并联机器人
  3. 如何维护关键字_SEO人如何制定工作计划?【大站】
  4. 中国钢铁行业战略规划及项目建设动态分析报告2021-2027年
  5. 2022年跨境卖家如何布局海外市场?东南亚“钱”景可观
  6. openssl简介-指令asn1parse
  7. mysql 经纬度距离 自定义函数_mysql 经纬度计算距离 自定义函数
  8. Java笔记:与系统交互、系统相关的类,Object类
  9. 织梦添加新变量和删除新变量的方法
  10. laravel 安装配置前准备