从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();
}
}
}
}
分享到:
相关推荐
异步计算Java 中异步计算与 Future 的演示
### 使用Java异步编程实现简单网络请求的知识点详解 #### 一、概述 本文将详细介绍一个使用Java异步编程模型实现简单网络请求的例子。通过这个示例,我们可以了解到如何利用Java中的多线程机制和异步处理技术来...
`Future`接口表示异步计算的结果,可以用来检查任务是否完成,获取结果或者取消任务。 总结,Java异步技术是提升系统效率的关键,从NIO的非阻塞I/O到高阶的`CompletableFuture`,再到事件驱动的Reactor模式,Java...
Java 5引入了`Future`和`Callable`接口,用于异步计算结果。`Callable`接口类似于`Runnable`,但可以返回一个结果。`Future`接口代表异步计算的结果,提供检查任务是否完成、取消任务、获取结果等方法。通过`...
在Java中,`java.util.concurrent.Future`接口代表一个异步计算的结果。它提供了检查计算是否完成、获取结果或取消任务的能力。但请注意,Future对象本身并不执行任何计算,而是与一个对应的`java.util.concurrent....
在Java中,通常通过Future和Callable接口实现异步计算,或者使用ExecutorService和CompletionService来管理和控制异步任务。 三、ExecutorService与ThreadPoolExecutor ExecutorService是Java并发框架中的核心接口...
Java异步技术是现代软件开发中的重要组成部分,它允许程序在执行某项任务时不必等待其完成,而是立即返回并处理其他工作。这种方式可以显著提高应用程序的响应速度和并发性能,尤其是在I/O密集型和计算密集型的任务...
Future接口代表异步计算的结果,可以用来查询任务是否完成或者获取结果。 5. **并行流(Parallel Stream)**:Java 8引入了并行流,允许开发者利用硬件并行性对数据进行并行操作。Stream API的parallel()方法可以将...
- **作用**:表示异步计算的结果。 - **原理**:Future对象代表了一个尚未完成的任务的结果,可以通过get()方法获取结果,如果任务未完成,则会阻塞等待。 - **使用场景**:适用于需要异步获取计算结果的场景。 ...
`Future`接口代表了一个异步计算的结果。它允许调用者注册回调函数以获取计算结果,并且可以取消正在运行的任务。 例如: ```java public class Example { public Future<String> computeAsync() { ...
`Future`是一个接口,表示一个异步计算的结果,而`FutureTask`是`Future`的实现,它同时实现了Runnable,可以由ExecutorService提交执行。调用`Future`的`get`方法会阻塞直到结果可用,而`isDone`和`isCancelled`...
Java 实现线程异步是程序设计中的一个重要概念,它涉及到多任务并行处理和非阻塞执行。在Java中,我们可以通过多种方式来实现线程的异步操作,以提高程序的执行效率和响应速度。 一、Java Thread 类 Java Thread 类...
3. **Future接口**:Java并发包(java.util.concurrent)中的Future接口表示一个异步计算的结果。它提供了检查计算是否完成、取消计算、获取结果(可能阻塞直到计算完成)以及检查计算是否成功或抛出异常的方法。 4...
1. **Java Future 和 CompletableFuture**:Java 5引入了Future接口,用于表示异步计算的结果。从Java 8开始,CompletableFuture类提供了更强大的功能,允许链式调用、组合多个异步操作以及设置回调函数。例如,可以...
Future接口表示异步计算的结果,并且只有几种方法: 检查任务是否完成或取消 取消任务 等待任务完成(如有必要)然后获得结果 但是, Future接口在构建非平凡的异步计算时有很大的局限性: 无法为将来的比赛注册回叫...
FutureTask 是 Java 中的一种非常重要的多线程设计模式,用于异步计算线程之间的结果传递。在 JDK 中,FutureTask 类是 Future 模式的实现,它实现了 Runnable 接口,作为单独的线程运行。在其 run() 方法中,通过 ...
本篇将详细讲解Java中的组合式异步编程方法,特别是从Java 7到Java 8的演变以及如何利用Future和CompletableFuture API来实现异步计算。 首先,日志代码的优化是一个很好的实践,它通过条件判断避免了不必要的计算...
Java中的`Future`接口是Java并发编程中一个重要的概念,它是`java.util.concurrent`包下的一个接口,主要用于处理异步计算的结果。`Future`接口提供了一些方法来检查任务是否完成,获取或取消任务的结果,以及在必要...
Future框架 主要解决异步执行任务的需求。在传统的同步执行中,程序需要等待一个操作完成后才能继续执行,这在处理长时间运行的任务时会造成效率低下。Future框架通过提供一个代表未来结果的对象来解决这一问题。...