Java简单实现“主线程等待所有子线程完成再继续”

[b][size=small]引言:[/size][/b]

在一些项目中,某些时候会引入批量任务。这时常会考虑用多线程并发请求,组装总结果集后再返回前端的处理。便引出一个常见的多线程应用——“主线程等待子线程完成后,才能继续做后续处理”

对于这一问题常见的解决方式有以下几种:

1,睡眠。(定时询问)
2,回调+阻塞。(挂起等被唤醒)
3,事件+阻塞。(事件驱动模型)
4,JDK_API。
5,其它。(废话了;-0)

本文将介绍一个1.5版后提供的API——“java.util.concurrent.CountDownLatch”。快速实现。

样例已附于文尾。

[b][size=small]正文:[/size][/b]

[b]CountDownLatch有三个主要方法:[/b]

1,CountDownLatch(int count)。
构造方法。count参数为指定的计数。

2,countDown()。
将计数按1步长递减。此时,如果变为零则释放所有等待线程;如果变前为零则无动作;如果大于零则减1。

3,await()。
使线程处于等待状态。此时,如果当前计数非零则继续等待;如果是零立即返回。

由介绍,我们可以设计一个本文议题的解决模型:

[b]解决模型:[/b]

1,计数者。
创建两个计数,start(1)、done(N)。可以被主、子线程访问到。

2,子线程。
操作前进入start(1).await();
操作完成后done(N).countDown();

3,主线程。
先创建N个子线程并直接启动(子线程进入操作前的start(1).await());
主线程处理子线程启动前的准备操作后,start(1).countDown()所有子线程立即通过start(0).await();
主线程处理其他与子线程返回无依赖的操作后,done(N).await()进入等待;
...
所有子线程完成后,都执行了done(N).countDown()此时N变为零;
主线程继续。

Java代码的实现非常简单,就不解释了。直接附上源文件于文尾。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值