FutureTask应用场景:
如果不想分支线程阻塞主线程,又想取得分支线程的执行结果,就用FutureTask
FutureTask简介:
FutureTask是一种可以取消的异步的计算任务。它的计算是通过Callable实现的,它等价于可以携带结果的Runnable,并且有三个状态:等待、运行和完成。完成包括所有计算以任意的方式结束,包括正常结束、取消和异常。
Future有个get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。
Executor框架利用FutureTask来完成异步任务,并可以用来进行任何潜在的耗时的计算。一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
FutureTask有下面几个重要的方法:
1.get() 阻塞一直等待执行完成拿到结果
2.get(int timeout, TimeUnit timeUnit) 阻塞一直等待执行完成拿到结果,如果在超时时间内,没有拿到抛出异常
3.isCancelled() 是否被取消
4.isDone() 是否已经完成
5.cancel(boolean mayInterruptIfRunning) 试图取消正在执行的任务
下面是网上找的FutureTask的示例:
public class CountNum implements Callable {
private Integer sum;
public CountNum(Integer sum) {
this.sum = sum;
}
public Object call() throws Exception {
for (int i = 0; i < 100; i++) {
sum = sum + i;
}
// 休眠5秒钟,观察主线程行为,预期的结果是主线程会继续执行,到要取得FutureTask的结果是等待直至完成。
Thread.sleep(3000);
System.out.println("futureTask 执行完成" + System.currentTimeMillis());
return sum;
}
}
public class FutureTaskTest {
/**
* @param args
*/
public static void main(String[] args) {
CountNum cn = new CountNum(0);
// FutureTask<Integer> 这里的表示返回的是Integer
FutureTask<Integer> ft = new FutureTask<Integer>(cn);
Thread td = new Thread(ft);
System.out.println("futureTask开始执行计算:" + System.currentTimeMillis());
td.start();
System.out.println("main 主线程可以做些其他事情:" + System.currentTimeMillis());
try {
// futureTask的get方法会阻塞,知道可以取得结果为止
Integer result = ft.get();
System.out.println("计算的结果是:" + result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("取得分支线程执行的结果后,主线程可以继续处理其他事项");
}
}
分享到:
相关推荐
FutureTask用法及使用场景介绍 FutureTask是一种异步获取执行结果或取消执行任务的机制,它可以用来处理耗时的计算任务,使主线程不需要等待计算结果,而是继续执行其他任务。下面将详细介绍FutureTask的用法和使用...
下面将详细介绍`FutureTask`的主要特性和用法: 1. **构造方法**: - `FutureTask(Callable<V> callable)`:用给定的`Callable`实例创建一个新的`FutureTask`。 - `FutureTask(Runnable runnable, V result)`:用...
在本篇文章中,我们将深入探讨`ThreadPoolTaskExecutor`的配置及其使用,并结合`FutureTask`来讨论异步任务处理。 首先,让我们了解`ThreadPoolTaskExecutor`的基本配置。在Spring中,我们通常通过在配置文件或Java...
Java FutureTask类使用案例解析 Java FutureTask类是一种异步计算的工具,用于执行长时间的任务并获取结果。它实现了Runnable和Future接口,既可以作为一个Runnable对象提交给Executor执行,也可以作为一个Future...
在实际开发中,ExecutorService(如ThreadPoolExecutor)经常与Future和FutureTask一起使用,因为ExecutorService可以提交Runnable或Callable任务,并返回Future,从而实现对任务的异步处理和结果获取。例如: ```...
《揭密FutureTask:Java异步编程的核心工具》 在Java并发编程中,FutureTask扮演着至关重要的角色,它是实现异步计算的关键组件。...通过理解其内部原理和使用方法,开发者能够更高效地编写并发程序,提升系统性能。
当使用 FutureTask.get() 方法时,将返回 Callable 接口的返回对象。 FutureTask 的核心方法是 run() 方法,该方法执行 Callable 接口的任务逻辑,并将结果返回。在 run() 方法中,firstly,它会检查状态是否为 NEW...
2、 线程池使用一个线程,执行这个FutureTask任务,线程执行任务过程比较简单,最终会调用Callable.call()或者是Runnable.run()方法,然后得到一个结果,把结果存储在FutureTask实例的outcome属性中,同时把状态修改...
当`FutureTask`被提交给`ExecutorService`时,`ExecutorService`会调用`FutureTask`的`run()`方法来执行任务。任务完成后,结果将被存储,可以通过`get()`方法获取。 `ExecutorService`通常通过`Executors`工厂类...
因此,FutureTask不仅实现了Future接口的所有方法,还具有自己的run方法。 三、Future与FutureTask的关系 Future和FutureTask都是用于获取线程执行的返回结果,但是它们之间存在一些差异: 1. Future是接口,...
在这个简谈中,我们将深入探讨`FutureTask`的实现原理和使用方式。 首先,`FutureTask`实现了`Runnable`接口,这意味着它可以直接被`Executor`服务执行。同时,它也实现了`Future`接口,提供了检查任务是否完成、...
### Java多线程与并发(17-26)-JUC线程池-FutureTask详解 #### 一、概述 本文将围绕Java多线程与并发中的重要概念——`...理解`FutureTask`的工作原理及其使用方法,对于提高程序的并发性能和响应能力具有重要意义。
`Future`、`FutureTask`、`Callable`和`Runnable`是Java并发编程中的核心接口和类,它们在Android开发中同样有着广泛的应用。下面将详细介绍这些概念以及它们如何协同工作。 1. `Runnable`: 这是Java中最基础的多...
FutureTask可以作为一个可取消的任务提交给Executor服务执行,并且提供了检查任务状态(如是否完成、获取结果等)的方法。当我们想要在主线程中等待异步任务完成并获取其结果时,FutureTask就显得非常有用。它可以...
在Java并发编程中,通常我们会使用`ExecutorService`来提交任务,而`Future`和`FutureTask`就是与这些任务交互的关键。 首先,`Future`是一个接口,它提供了一种机制来检查异步计算是否完成,以及在计算完成后获取...
下面是一个使用`Callable`和`FutureTask`的简单示例: ```java import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import ...
接下来,我们将深入探讨这些组件的特性和使用方法。 首先,CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达一个特定的屏障点。CyclicBarrier的名字来源于它的可重用性,当所有线程都...
本文将详细解释Callable接口的使用、适配器模式在创建线程中的应用,以及FutureTask在其中的角色。 首先,Callable接口与Runnable接口类似,都是用于创建新线程的接口。但是,Runnable接口的run()方法无返回值,而...
在实际应用中,`FutureTask`经常与`ExecutorService`结合使用,形成一个异步执行模型,确保主程序在所有子线程执行完毕后再继续执行,同时能够获取到每个子线程的执行结果。这样的设计提高了程序的响应性和并发能力...
2. 使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。 3. 使用FutureTask对象作为Thread对象的target创建并启动新线程。 4. 调用FutureTask对象的get()方法来获得...