多线程如何通信CountDownLath

124 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

前言

  • CountDownLatch就是一个计数器。用来给我们线程进行倒计时的。当达到一个点的时候我们就可以进行处理别的业务。换句话说我一把放行10个线程处理业务。但是我不能让这10个线程随心所欲的一直执行下去。我需要达到一定条件后就集中等待下,我在发布另外的任务。
  • 比如公司开发分配任务后 , 1个月的开发周期开发就行了。但是中间可能需要不停的进行信息的互通。这样才能让别人知道自己的进度。在线程角度上我们可以称之为线程间的通信

CountDownLatch典型用法:

  • 某一线程在开始运行前等待n个线程执行完毕。将CountDownLatch的计数器初始化为new CountDownLatch(n), countdownLatch.countDown(),当计数器的值变为0时,在CountDownLatch上await()的线程就会被唤醒。一个典型应用场景就是启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。 CountDownLatch典型用法:
  • 实现多个线程开始执行任务的最大并行性。做法是初始化一个共享的CountDownLatch(1),将其计算器初始化为1,多个线程在开始执行任务前首先countdownlatch.await(),当主线程调用countDown()时,计数器变为0,多个线程同时被唤醒。

** 用CountDownLatch **

  • 功能现状

运营系统有统计报表、这个统计报表的页面一直加载很慢,所以需要对统计报表这块性能需进行优化。

  • 为主线程需要每个线程的统计结果进行聚合,然后返回给前端渲染,所以这里需要提供一种机制让主线程等所有的子线程都执行完之后再对每个线程统计的指标进行聚合。 这里我们使用CountDownLatch 来完成此功能。