`
jiangwenfeng762
  • 浏览: 288172 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java异步计算Future的使用

阅读更多

从jdk1.5开始我们可以利用Future来跟踪异步计算的结果。在此之前主线程要想获得工作线程(异步计算线程)的结果是比较麻烦的事情,需要我们进行特殊的程序结构设计,比较繁琐而且容易出错。有了Future我们就可以设计出比较优雅的异步计算程序结构模型:根据分而治之的思想,我们可以把异步计算的线程按照职责分为3类:

1. 异步计算的发起线程(控制线程):负责异步计算任务的分解和发起,把分解好的任务交给异步计算的work线程去执行,发起异步计算后,发起线程可以获得Futrue的集合,从而可以跟踪异步计算结果

2. 异步计算work线程:负责具体的计算任务

3. 异步计算结果收集线程:从发起线程那里获得Future的集合,并负责监控Future的状态,根据Future的状态来处理异步计算的结果。

 

以下是我根据上述想法写的一个例子:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class AsyncController {

	//线程池
	private ExecutorService executorService;

	//保存异步计算的Future
	private FutureContext<String> context;

	public AsyncController() {
		this.executorService = Executors.newFixedThreadPool(100);
		this.context = new FutureContext<String>();
	}

	public static void main(String[] args) {
		//启动异步计算
		AsyncController controller = new AsyncController();
		controller.startAsyncCompution();

		//启动异步计算结果输出线程,该线程扫描异步计算Futrue的状态,如果已经完成,则输出异步计算结果
		OutputResult output = new OutputResult();
		output.setFutureContext(controller.getFutureContext());
		Thread resultThread = new Thread(output);
		resultThread.start();
	}

	public FutureContext<String> getFutureContext() {
		return this.context;
	}

	public void startAsyncCompution() {
		/**
		 * 开启100个异步计算,每个异步计算线程随机sleep几秒来模拟计算耗时。
		 */
		final Random random = new Random();
		for (int i = 0; i < 100; i++) {
			Future<String> future = this.executorService
					.submit(new Callable<String>() {
						@Override
						public String call() throws Exception {
							int randomInt = random.nextInt(10);
							Thread.sleep(randomInt * 1000);
							return "" + randomInt;
						}
					});
			//每个异步计算的结果存放在context中
			this.context.addFuture(future);
		}
	}

	public static class FutureContext<T> {

		private List<Future<T>> futureList = new ArrayList<Future<T>>();

		public void addFuture(Future<T> future) {
			this.futureList.add(future);
		}

		public List<Future<T>> getFutureList() {
			return this.futureList;
		}
	}

	public static class OutputResult implements Runnable {

		private FutureContext<String> context;

		public void setFutureContext(FutureContext<String> context) {
			this.context = context;
		}

		@Override
		public void run() {
			System.out.println("start to output result:");
			List<Future<String>> list = this.context.getFutureList();

			for (Future<String> future : list) {
				this.outputResultFromFuture(future);
			}

			System.out.println("finish to output result.");
		}

		private void outputResultFromFuture(Future<String> future) {
			try {
				while (true) {
					if (future.isDone() && !future.isCancelled()) {
						System.out.println("Future:" + future + ",Result:"
								+ future.get());
						break;
					} else {
						Thread.sleep(1000);
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
 
分享到:
评论
2 楼 liyonghui160com 2015-12-22  
zmf829 写道
感觉有个bug, for (Future<String> future : list) { 
                this.outputResultFromFuture(future); 
            } 
循环时能保证list中future的值获取到的先后顺序么


不能 可以改为使用map存储
1 楼 zmf829 2015-07-31  
感觉有个bug, for (Future<String> future : list) { 
                this.outputResultFromFuture(future); 
            } 
循环时能保证list中future的值获取到的先后顺序么

相关推荐

    asynchronous-computation:Java 中异步计算与 Future 的演示

    异步计算Java 中异步计算与 Future 的演示

    使用Java异步编程实现一个简单的网络请求.txt

    ### 使用Java异步编程实现简单网络请求的知识点详解 #### 一、概述 本文将详细介绍一个使用Java异步编程模型实现简单网络请求的例子。通过这个示例,我们可以了解到如何利用Java中的多线程机制和异步处理技术来...

    Java异步技术原理和实践.rar_Java异步开发

    `Future`接口表示异步计算的结果,可以用来检查任务是否完成,获取结果或者取消任务。 总结,Java异步技术是提升系统效率的关键,从NIO的非阻塞I/O到高阶的`CompletableFuture`,再到事件驱动的Reactor模式,Java...

    Java实现异步调用

    Java 5引入了`Future`和`Callable`接口,用于异步计算结果。`Callable`接口类似于`Runnable`,但可以返回一个结果。`Future`接口代表异步计算的结果,提供检查任务是否完成、取消任务、获取结果等方法。通过`...

    Java多线程之异步Future机制的原理和实现共5页.p

    在Java中,`java.util.concurrent.Future`接口代表一个异步计算的结果。它提供了检查计算是否完成、获取结果或取消任务的能力。但请注意,Future对象本身并不执行任何计算,而是与一个对应的`java.util.concurrent....

    java多线程异步性

    在Java中,通常通过Future和Callable接口实现异步计算,或者使用ExecutorService和CompletionService来管理和控制异步任务。 三、ExecutorService与ThreadPoolExecutor ExecutorService是Java并发框架中的核心接口...

    Java异步技术原理和实践.zip_异步

    Java异步技术是现代软件开发中的重要组成部分,它允许程序在执行某项任务时不必等待其完成,而是立即返回并处理其他工作。这种方式可以显著提高应用程序的响应速度和并发性能,尤其是在I/O密集型和计算密集型的任务...

    JAVA并行计算的一些资料 论文

    Future接口代表异步计算的结果,可以用来查询任务是否完成或者获取结果。 5. **并行流(Parallel Stream)**:Java 8引入了并行流,允许开发者利用硬件并行性对数据进行并行操作。Stream API的parallel()方法可以将...

    java同步异步知识

    - **作用**:表示异步计算的结果。 - **原理**:Future对象代表了一个尚未完成的任务的结果,可以通过get()方法获取结果,如果任务未完成,则会阻塞等待。 - **使用场景**:适用于需要异步获取计算结果的场景。 ...

    java同步、异步相关知识点

    `Future`接口代表了一个异步计算的结果。它允许调用者注册回调函数以获取计算结果,并且可以取消正在运行的任务。 例如: ```java public class Example { public Future&lt;String&gt; computeAsync() { ...

    Java异步编程最佳实践_.docx

    `Future`是一个接口,表示一个异步计算的结果,而`FutureTask`是`Future`的实现,它同时实现了Runnable,可以由ExecutorService提交执行。调用`Future`的`get`方法会阻塞直到结果可用,而`isDone`和`isCancelled`...

    java实现线程的异步

    Java 实现线程异步是程序设计中的一个重要概念,它涉及到多任务并行处理和非阻塞执行。在Java中,我们可以通过多种方式来实现线程的异步操作,以提高程序的执行效率和响应速度。 一、Java Thread 类 Java Thread 类...

    java异步通信

    3. **Future接口**:Java并发包(java.util.concurrent)中的Future接口表示一个异步计算的结果。它提供了检查计算是否完成、取消计算、获取结果(可能阻塞直到计算完成)以及检查计算是否成功或抛出异常的方法。 4...

    Java异步回调机制实例解析共5页.pdf.zip

    1. **Java Future 和 CompletableFuture**:Java 5引入了Future接口,用于表示异步计算的结果。从Java 8开始,CompletableFuture类提供了更强大的功能,允许链式调用、组合多个异步操作以及设置回调函数。例如,可以...

    javafuture源码-demo-java-completablefuture:“带有CompletableFuture的Java异步编程”

    Future接口表示异步计算的结果,并且只有几种方法: 检查任务是否完成或取消 取消任务 等待任务完成(如有必要)然后获得结果 但是, Future接口在构建非平凡的异步计算时有很大的局限性: 无法为将来的比赛注册回叫...

    FutureTask底层实现分析,有了FutureTask主线程要想获得工作线程(异步计算线程)的结果变得比较简单

    FutureTask 是 Java 中的一种非常重要的多线程设计模式,用于异步计算线程之间的结果传递。在 JDK 中,FutureTask 类是 Future 模式的实现,它实现了 Runnable 接口,作为单独的线程运行。在其 run() 方法中,通过 ...

    Java组合式异步编程方法详解.pdf

    本篇将详细讲解Java中的组合式异步编程方法,特别是从Java 7到Java 8的演变以及如何利用Future和CompletableFuture API来实现异步计算。 首先,日志代码的优化是一个很好的实践,它通过条件判断避免了不必要的计算...

    Java的Future使用方法

    Java中的`Future`接口是Java并发编程中一个重要的概念,它是`java.util.concurrent`包下的一个接口,主要用于处理异步计算的结果。`Future`接口提供了一些方法来检查任务是否完成,获取或取消任务的结果,以及在必要...

    探索Java并发:Future与ForkJoin框架深度解析

    Future框架 主要解决异步执行任务的需求。在传统的同步执行中,程序需要等待一个操作完成后才能继续执行,这在处理长时间运行的任务时会造成效率低下。Future框架通过提供一个代表未来结果的对象来解决这一问题。...

Global site tag (gtag.js) - Google Analytics