引言:
在一些项目中,某些时候会引入批量任务。这时常会考虑用多线程并发请求,组装总结果集后再返回前端的处理。便引出一个常见的多线程应用——“主线程等待子线程完成后,才能继续做后续处理”
对于这一问题常见的解决方式有以下几种:
1,睡眠。(定时询问)
2,回调+阻塞。(挂起等被唤醒)
3,事件+阻塞。(事件驱动模型)
4,JDK_API。
5,其它。(废话了;-0)
本文将介绍一个1.5版后提供的API——“java.util.concurrent.CountDownLatch”。快速实现。
样例已附于文尾。
正文:
CountDownLatch有三个主要方法:
1,CountDownLatch(int count)。
构造方法。count参数为指定的计数。
2,countDown()。
将计数按1步长递减。此时,如果变为零则释放所有等待线程;如果变前为零则无动作;如果大于零则减1。
3,await()。
使线程处于等待状态。此时,如果当前计数非零则继续等待;如果是零立即返回。
由介绍,我们可以设计一个本文议题的解决模型:
解决模型:
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代码的实现非常简单,就不解释了。直接附上源文件于文尾。
分享到:
相关推荐
JAVA主线程等待子线程执行完毕再执行[参照].pdf
Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程...
Java多线程--让主线程等待所有子线程执行完毕
主线程等待子多线程(无结果返回)执行完成再继续执行
我在工作的过程中遇到一个问题,需要主线程等等所有子线程执行完后再做某件事情,在网上找了很多代码,都没有真正解决这个问题. 现在我解决了这个问题,把代码共享出来供大家参考. 代码中有注释和注意事项,相信大家看过...
主线程如何捕获子线程的异常---马克-to-win java视频的介绍
对于多线程而言,一个主要的难题就是如何线程是否都已经执行结束。 也就是说,需要在主线程开启子多线程后,直到子线程全部执行结束为止,回到主线程。
非常实用不解释,用了才知道 个人收藏的一部分资料将陆续给大家上传
Handler消息传递详解,子线程到子线程,主线程到子线程,子线程到主线程 三种消息,Looper,Handler工作机制详解 https://blog.csdn.net/shoneworn/article/details/80447651
python 零基础学习篇
自己学着编写的一个JAVA多线程程序,该程序实现的功能是:在主线程main中创建两个子线程,A和B,线程A先运行,再运行B线程,当两个子线程都运行完毕后,才运行主线程,并最终结束整个程序的运行。 希望该程序对初学...
java 子线程通过观察者模式通知主线程
python爬虫-08-主线程会等待子线程执行结束再结束.ev4.rar
我就废话不多说了,还是直接看代码吧! from time import ctime ...线程名为:',threading.current_thread().name ) time.sleep(0.2) def b(x): #for i in range(5): print('Program b('+x+')
子线程更新主线程数据(再谈多线程)
主线程去控制子线程wait与notify
C#子线程刷新主线程示例源码 功能介绍: 使用线程操作 1、实时显示当前时间 2、输入加数和被加数,自动出现... 使用了多线程实现了子线程刷新主线程 ,使用委托刷新主线程。 注意: 开发环境为Visual Studio 2012
C# Winfrom必须掌握的技术,主线程显示数据,子线程获取数据,这是我做项目实际用到的技术。