从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 的演示
`Future`接口表示异步计算的结果,可以用来检查任务是否完成,获取结果或者取消任务。 总结,Java异步技术是提升系统效率的关键,从NIO的非阻塞I/O到高阶的`CompletableFuture`,再到事件驱动的Reactor模式,Java...
- **Future** 接口代表了一个异步计算的结果。它可以用来获取计算的结果或检查计算是否已经完成。 - **Callable** 接口是一种可以返回结果的任务接口,它通过`call()`方法返回一个结果。在本例中,两个网络请求任务...
在Java中,`java.util.concurrent.Future`接口代表一个异步计算的结果。它提供了检查计算是否完成、获取结果或取消任务的能力。但请注意,Future对象本身并不执行任何计算,而是与一个对应的`java.util.concurrent....
在Java中,通常通过Future和Callable接口实现异步计算,或者使用ExecutorService和CompletionService来管理和控制异步任务。 三、ExecutorService与ThreadPoolExecutor ExecutorService是Java并发框架中的核心接口...
Java 5引入了`Future`和`Callable`接口,用于异步计算结果。`Callable`接口类似于`Runnable`,但可以返回一个结果。`Future`接口代表异步计算的结果,提供检查任务是否完成、取消任务、获取结果等方法。通过`...
Java异步技术是现代软件开发中的重要组成部分,它允许程序在执行某项任务时不必等待其完成,而是立即返回并处理其他工作。这种方式可以显著提高应用程序的响应速度和并发性能,尤其是在I/O密集型和计算密集型的任务...
Future接口代表异步计算的结果,可以用来查询任务是否完成或者获取结果。 5. **并行流(Parallel Stream)**:Java 8引入了并行流,允许开发者利用硬件并行性对数据进行并行操作。Stream API的parallel()方法可以将...
`Future`接口代表了一个异步计算的结果。它允许调用者注册回调函数以获取计算结果,并且可以取消正在运行的任务。 例如: ```java public class Example { public Future<String> computeAsync() { ...
`Future`是一个接口,表示一个异步计算的结果,而`FutureTask`是`Future`的实现,它同时实现了Runnable,可以由ExecutorService提交执行。调用`Future`的`get`方法会阻塞直到结果可用,而`isDone`和`isCancelled`...
- **作用**:表示异步计算的结果。 - **原理**:Future对象代表了一个尚未完成的任务的结果,可以通过get()方法获取结果,如果任务未完成,则会阻塞等待。 - **使用场景**:适用于需要异步获取计算结果的场景。 ...
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来实现异步计算。 首先,日志代码的优化是一个很好的实践,它通过条件判断避免了不必要的计算...
Future框架 主要解决异步执行任务的需求。在传统的同步执行中,程序需要等待一个操作完成后才能继续执行,这在处理长时间运行的任务时会造成效率低下。Future框架通过提供一个代表未来结果的对象来解决这一问题。...
老生常谈java中的Future模式 在 Java 中,Future 模式是一种常用的设计模式,用于处理并发编程中的多线程问题。在这个模式中,线程 A 需要等待线程 B 的结果,但线程 A 不需要一直等待线程 B,可以先拿到一个未来的...