线程池--CountDownLatch

今天碰到了个比较棘手的问题,就是存在有几个运行缓慢的任务,需要分线程同时处理来稍微提升一些速度,但是这一个事物必须要等这些线程全部执行完获取到相应的数据后才能执行下一步,所以就引出了今天要提的一个东西CountDownLatch,通过它就能实现上述场景

下面是部分代码实现:

//创建一个核心线程数为4的线程池
ExecutorService executorService = new ThreadPoolExecutor(4, 10,
        60L, TimeUnit.SECONDS,
        new ArrayBlockingQueue(10));
CountDownLatch latch = new CountDownLatch(4);
executorService.execute(() -> {
	//第一个子任务
	latch.countDown();
}

executorService.execute(() -> {
	//第二个子任务
	latch.countDown();
}

executorService.execute(() -> {
	//第三个子任务
	latch.countDown();
}

executorService.execute(() -> {
	//第四个子任务
	latch.countDown();
}

//关闭线程池
executorService.shutdown();

try {
    latch.await();
} catch (InterruptedException e) {
    e.printStackTrace();
}
 
// 主任务

CountDownLatch是通过一个计数器来实现的,计数器的初始值是线程的数量(就是代码中的那个4)。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,此时被锁上的主线程就可以被唤醒恢复工作了。

通过上述代码就能完成,主任务等子任务完成后再执行的场景,当然要记得关线程池哦~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

缘丶沐逸尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值