背景:实际开发中经常会出现当前线程必须等待子线程执行完毕以后的场景。写了一个简单的例子,使用了BlockingQueue的特性来实现。后面可以优化成按当前线程ID进行控制
使用方法:
public static void main(String[] args) {
TaskManager manager = TaskManager.getInstance(4);
//新建一批线程任务执行
for(int i = 0; i < 100; i++){
manager.doTask(new Runnable(){
public void run() {
System.out.println("------------> " + System.currentTimeMillis());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
});
}
//等待所有子线程执行完毕
manager.waitAllThreadFinsh();
System.out.println("Finish");
}
package task;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public final class TaskManager {
private static TaskManager instance;
private ThreadPoolExecutor pool;
private TaskSupport taskSupport;
private TaskManager(int poolSize){
if(poolSize == 0){
poolSize = Integer.parseInt(System.getenv("NUMBER_OF_PROCESSORS"));
}
taskSupport = new TaskSupport(poolSize);
pool = new ThreadPoolExecutor(poolSize, poolSize, 1000L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
/**
* 外部执行入口
* @param task
*/
public void doTask(final Runnable task){
if(taskSupport.waitNotFull()){
pool.execute(new Runnable(){
public void run() {
try{
task.run();
}
finally{
taskSupport.removeQueue();
}
}
});
}
}
public void waitAllThreadFinsh(){
taskSupport.waitAllThreadFinsh();
}
public static synchronized TaskManager getInstance(int cpuCount){
if(instance == null){
instance = new TaskManager(cpuCount);
}
return instance;
}
}
package task;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
class TaskSupport {
BlockingQueue<Object> supportQueue;
public TaskSupport(int poolSize) {
supportQueue = new ArrayBlockingQueue<Object>(poolSize);
}
/**
* 等待队列有可用空间,之前一直等待。
*/
public boolean waitNotFull() {
try {
while(!supportQueue.offer(new Object(), 1, TimeUnit.SECONDS)){
}
} catch (InterruptedException e) {
return false;
}
return true;
}
/**
* 当前线程等待子线程执行完成
*/
public void waitAllThreadFinsh(){
while(supportQueue.size() > 0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
}
}
public void removeQueue(){
supportQueue.poll();
}
}
分享到:
相关推荐
JAVA主线程等待子线程执行完毕再执行[参照].pdf
非常实用不解释,用了才知道 个人收藏的一部分资料将陆续给大家上传
我在工作的过程中遇到一个问题,需要主线程等等所有子线程执行完后再做某件事情,在网上找了很多代码,都没有真正解决这个问题. 现在我解决了这个问题,把代码共享出来供大家参考. 代码中有注释和注意事项,相信大家看过...
对于多线程而言,一个主要的难题就是如何线程是否都已经执行结束。 也就是说,需要在主线程开启子多线程后,直到子线程全部执行结束为止,回到主线程。
Handler消息传递详解,子线程到子线程,主线程到子线程,子线程到主线程 三种消息,Looper,Handler工作机制详解 https://blog.csdn.net/shoneworn/article/details/80447651
NULL 博文链接:https://zhaoningbo.iteye.com/blog/1158225
Java多线程--让主线程等待所有子线程执行完毕
python 零基础学习篇
资源池 等待 所有线程 执行完毕 的方法,比较简单,没有形成可以执行的代码
python爬虫-08-主线程会等待子线程执行结束再结束.ev4.rar
主线程等待子多线程(无结果返回)执行完成再继续执行
下面小编就为大家带来一篇C#子线程执行完后通知主线程的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis()在后一个子进程结束后...
Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程...
Java主线程等待所有子线程执行完毕在执行,其实在我们的工作中经常的用到,本篇文章就介绍了Java多线程--让主线程等待所有子线程执行完毕在执行,有需要的可以了解一下。
C#子线程刷新主线程示例源码 功能介绍: 使用线程操作 1、实时显示当前时间 2、输入加数和被加数,自动出现... 使用了多线程实现了子线程刷新主线程 ,使用委托刷新主线程。 注意: 开发环境为Visual Studio 2012
Unity异步线程调用主线程脚本程序,在Unity中异步线程调用主线程会报错,所以编写了一个Loom
程序:安装在移动设备上的每一个应用,都是一个程序 进程:正在运行的每一个应用程序,都是一个进程;相当于一个任务; 线程:执行任务时的一个单独的代码块(单独的功能)称作线程
自己学着编写的一个JAVA多线程程序,该程序实现的功能是:在主线程main中创建两个子线程,A和B,线程A先运行,再运行B线程,当两个子线程都运行完毕后,才运行主线程,并最终结束整个程序的运行。 希望该程序对初学...
Qt主线程与次线程通信实例代码,方便大家学习下载使用! Qt主线程与次线程通信实例代码,方便大家学习下载使用! Qt主线程与次线程通信实例代码,方便大家学习下载使用!