Java 线程池 & CountDownLatch

线程池 & CountDownLatch

CountDownLatch

背景
在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用 Thread 类的 join 方法,让主线程等待被 join 的线程执行完之后,主线程才能继续往下执行。
但是在线程池中,由于每个线程不会真正意义上的结束,因此Thread.join()方法无法生效,因此,在线程池中一般应用CountDownLatch来确定执行顺序。

CountDownLatch 主要方法

  1. await() throws InterruptedException:调用该方法的线程等到构造方法传入的 count 被减到 0 时,才能继续往向下执行;
  2. await(long timeout, TimeUnit unit):与上面的 await 方法功能一致,只不过这里有了时间限制,调用该方法的线程等到指定的 timeout 时间后,不管 count 是否减至为 0,都会继续往下执行;
  3. countDown():使当前 CountDownLatch 初始值 count-1;
  4. long getCount():获取当前 CountDownLatch 的值;

每当一个线程执行完一个指定动作之后,调用countDown() 方法,count-1,当count > 0时,主线程调用 await() 方法,线程阻塞,需等待count变为0;当 count = 0 时,await() 方法失效,主线程不再阻塞,开始继续执行下面的代码。

示例代码

例如:
运动员进行跑步比赛,赛场有1名裁判(main线程)和5名运动员(线程池创建的5个线程),
准备阶段:运动员开始检录直到站上跑到,准备完成,裁判需要所有运动员都准备完毕后才能开始比赛;
发令阶段:所有运动员准备完成后,裁判发令,开始比赛;
比赛阶段:运动员听到发令枪后,开始赛跑;
撞线阶段:运动员冲过终点,完成比赛;
比赛结束:所有运动员完成比赛后,裁判员宣布比赛结束。
各个阶段之间都有先后顺序,利用代码实现如下:

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountDownLatchTest {
   

    public static void main(String[] args) throws Exception{
   
        ExecutorService runnerPool = Executors.newFixedThreadPool(5);
        int countStart 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值