`

多线程应用 任务执行 等待所有任务完成一起处理

阅读更多

首先是执行算法的CALL

/**
 * <dl>
 * <dt><b>类功能概要</b></dt>
 * <dd></dd>
 * </dl>
 * Version     	  Date       Company   Developer    Revise
 * -------     ----------   ---------  ---------    ------
 * pisv2.3.2   2012-02-24   yihaodian   xiangqi     create
 */
package com.yihaodian.pis.thread;

import java.util.concurrent.Callable;

/**
 * @author yhd
 *
 */
class Content implements Callable<Integer> {

	public int data;
	public Integer call() throws Exception {
		data ++;
		//此段可以表示用来执行其他耗时任务
		Thread.sleep(5000l);
		return data;
	}
	public int getData() {
		return data;
	}
	public void setData(int data) {
		this.data = data;
	}
	
}

 其次是执行这个计算的任务线程

/**
 * <dl>
 * <dt><b>类功能概要</b></dt>
 * <dd></dd>
 * </dl>
 * Version     	  Date       Company   Developer    Revise
 * -------     ----------   ---------  ---------    ------
 * pisv2.3.2   2012-02-24   yihaodian   xiangqi     create
 */
package com.yihaodian.pis.thread;

import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author yhd
 *
 */
public class TestCall {

	/**
	 * <dl>
	 * <dt><b>方法功能概要</b></dt>
	 * <dd></dd>
	 * </dl>
	 */
	public Future<Integer> excute(Content content) {
		BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
		ThreadPoolExecutor executor = new ThreadPoolExecutor(50, 100, 1,
				TimeUnit.MINUTES, workQueue,
				new ThreadPoolExecutor.AbortPolicy());
		return executor.submit(content);
	}

}

 最后是主类,内部类设定参数,得到计算后的数据

/**
 * <dl>
 * <dt><b>类功能概要</b></dt>
 * <dd></dd>
 * </dl>
 * Version     	  Date       Company   Developer    Revise
 * -------     ----------   ---------  ---------    ------
 * pisv2.3.2   2012-02-24   yihaodian   xiangqi     create
 */
package com.yihaodian.pis.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author yhd
 * 
 */
public class Test {

	/**
	 * <dl>
	 * <dt><b>方法功能概要</b></dt>
	 * <dd></dd>
	 * </dl>
	 */
	public static void main(String[] args) {
		BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
		ThreadPoolExecutor executor = new ThreadPoolExecutor(50, 100, 1,
				TimeUnit.MINUTES, workQueue,
				new ThreadPoolExecutor.AbortPolicy());
		class MainThread implements Runnable {
			TestCall testCall = new TestCall();
			@Override
			public void run() {
				try {
				List<Future<Integer>> tasks = new ArrayList<Future<Integer>>();
				for (int i = 0; i < 1000; i++) {
					Content content = new Content();
					content.setData(i);
					tasks.add(testCall.excute(content));
					
				}
				//结束循环,开始得到结果
				//状态用来标记任务完成的状态
				int status = 0;
				while (status != 2) {
					status = 1;
					for(Future<Integer> task : tasks) {
						if (!task.isDone()) {
							status = 0;
							//等待任务都完成
							Thread.sleep(1000l);
							break;
						}
						if (status == 1 || status == 2) {
							System.out.println(task.get());
							status = 2;
						}
					}
				}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		MainThread mainThread = new MainThread();
		executor.submit(mainThread);
	}

}

 最后得到的结果就是   你想要的    2

分享到:
评论

相关推荐

    Java多线程--等待所有子线程执行完的五种方法.docx

    在Java多线程编程中,有时我们需要确保所有子线程执行完毕后再进行后续操作,例如在并发测试、数据聚合或资源清理等场景。本篇文章将详细介绍五种在Java中等待所有子线程执行完的方法。 ### 方法一:使用`sleep`...

    Qt 之多线程处理多任务

    在Qt框架中,多线程处理多任务是提高应用程序性能和响应能力的重要手段。Qt提供了丰富的多线程支持,使得开发者能够充分利用现代计算机的多核处理器资源,避免UI线程因执行耗时操作而导致的界面假死问题。本文将深入...

    多线程并行执行,汇总结果

    在IT行业中,多线程并行执行是一种常见的优化策略,特别是在处理大数据量或者需要高性能计算的任务时。"CountDownLatch" 和 "Thread" 是Java编程语言中实现多线程并行执行的关键工具,它们有助于提高程序的运行效率...

    多线程并发执行任务

    在IT领域,多线程并发执行任务是一种常见的优化策略,特别是在服务器端开发、实时系统以及高性能计算中。本文将深入探讨多线程并发执行任务的相关知识点,并基于提供的`MyThread.java`文件,来分析和理解如何在Java...

    通过多线程任务处理大批量耗时业务并返回结果

    `CompletionService`通过`Future`接口返回每个任务的结果,使得我们可以在任务完成的瞬间得到结果,而无需等待所有任务执行完毕。这对于处理大批量任务并需要实时处理结果的场景非常有用。 在提供的`ThreadDemo`...

    基于任务线程处理例子

    代码示例中,可能会包含创建`ExecutorService`、创建任务(可能是`Runnable`或`Callable`)、提交任务到线程池、等待所有任务完成(使用`shutdown()`和`awaitTermination()`)的流程。此外,可能还会涉及线程安全的...

    多线程执行任务具体实现

    在计算机科学中,多线程是一种程序设计技术,它允许应用程序同时执行多个不同的任务或子任务,从而提高系统的效率和响应速度。多线程在Java、C++、Python等编程语言中都有广泛的应用。本篇文章将深入探讨多线程执行...

    C#多线程执行

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的现代编程语言中。C#提供了丰富的多线程支持,使得开发者能够高效地利用多核处理器资源,提高程序的运行效率。本篇文章将深入探讨C#中的多线程执行...

    多个线程到达后才能执行某个任务,并且只能执行一次

    标题中的“多个线程到达后才能执行某个任务,并且只能执行一次”指的是在多线程环境下,需要确保一个任务在所有等待线程都到达特定条件后才开始执行,并且这个任务在整个程序运行过程中只被执行一次。这通常涉及到...

    WinForm C#多线程等待窗体

    在标题“WinForm C#多线程等待窗体”中,我们探讨的关键点是如何在进行耗时操作时创建一个等待窗体,让用户知道程序正在执行任务,并且不允许用户进行其他操作,直到任务完成。描述提到了“非托管资源”和...

    多线程实现任务管理器

    在编程领域,多线程是一种常见且强大的技术,它允许应用程序同时执行多个任务,从而提高系统效率和响应性。在C#中,多线程的使用尤其广泛,尤其是在需要进行并发处理或者异步操作的场景下。本篇将深入探讨如何在C#中...

    java多线程之A线程等B、C线程都执行完在执行的结果示例

    Java多线程编程是开发高并发应用的关键技术之一,它涉及到如何有效地利用系统资源,提高程序的执行效率。在这个场景中,我们关注的是一个特定的多线程问题:A线程需要等待B线程和C线程执行完毕后再开始执行,同时...

    C#多线程等待窗体

    "等待窗体"是多线程应用中一个重要的概念,通常用于在后台任务执行时提供用户友好的界面反馈。本项目就是针对C# Winform应用设计的一个等待窗体,它能在后台任务运行时显示进度或状态,让用户知道程序正在工作,并未...

    C#(asp.net)多线程用法示例(可用于同时处理多个任务)

    在C#(ASP.NET)开发中,多线程是一个重要的概念,它允许应用程序同时执行多个任务,从而提高程序的效率和响应性。本示例主要介绍了如何使用`System.Threading.Thread`类来创建和管理多线程,以进行并行计算。 首先,...

    多线程计数实现多线程执行后再执行主线程

    ### 多线程计数实现多线程执行后再执行主线程 #### 一、知识点概述 本文将深入探讨如何利用`CountDownLatch`机制来确保多个子线程完成各自的任务后,再让主线程继续执行的方法。这种方法在项目开发中非常实用,...

    C#多线程多任务管理模型.zip

    - **Program.cs**:程序的入口点,可能启动多线程应用。 - **ThreadManagerDemo.csproj**:项目文件,定义了项目的结构和编译配置。 - **FormMain.resx**:资源文件,存储窗体的本地化资源。 - **bin, obj**:...

    2.2多线程应用程序设计

    在编程领域,多线程应用程序设计是至关重要的一个主题,特别是在现代计算机系统中,多核处理器的普及使得并发执行成为提升程序性能的有效手段。本文将深入探讨多线程应用程序设计的基础概念、优缺点以及实现方法,...

    windows环境下的多线程编程原理与应用

    合理的线程数量和良好的同步策略是实现高性能多线程应用的关键。 总结,Windows环境下的多线程编程涉及了从线程创建、同步到通信的多个方面,理解和掌握这些原理与技术对于开发高效、稳定的应用至关重要。在实践中...

    多任务多线程下载器源码

    标题中的“多任务多线程下载器源码”是指一个软件程序,它的功能是同时...开发者可以通过阅读和学习这个源码,理解如何在实际编程中应用多线程技术来优化性能,以及如何构建一个能够处理多个并发任务的下载管理系统。

    多线程多任务编程实例

    在编程中,多线程经常被用来实现多任务,使得程序可以在执行一项任务的同时处理其他任务,提高用户体验。 在VC++6.0环境中实现多线程,我们需要使用Windows API中的`CreateThread`函数或者C++标准库中的`std::...

Global site tag (gtag.js) - Google Analytics