[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代码的实现非常简单,就不解释了。直接附上源文件于文尾。
在一些项目中,某些时候会引入批量任务。这时常会考虑用多线程并发请求,组装总结果集后再返回前端的处理。便引出一个常见的多线程应用——“主线程等待子线程完成后,才能继续做后续处理”
对于这一问题常见的解决方式有以下几种:
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代码的实现非常简单,就不解释了。直接附上源文件于文尾。