此处移至原文阅读
FutureTask:一个可取消的异步任务执行类,这个类提供了Future接口的基本实现,主要有以下功能:
- 异步执行任务
- 可以开始、取消以及查看任务是否完成
- 如果任务没有执行完,get方法会导致线程阻塞
- 一旦一个执行任务已经完成就不能再次开始和结束(除非执行时通过runAndReset()方法)
类关系
先看一下类关系图:
- Future为Java Tuture模式接口,Runable是实现异步操作的接口
- RunnableFuture同时继承了以上两个接口,所以同时具有两种功能
- 而FutureTask为RunnableFuture的实现类
成员变量
修饰符 | 变量名 | 描述 |
---|---|---|
private Callable | callable | 任务的执行体 |
private Object | outcone | 最终输出的结果 |
private volatile Thread | runner | 异步执行任务的线程 |
private volatile WaitNode | waiters | 获取任务结果的等待线程(是一个链式列表) |
private volatile int | state | 当前一步任务的状态 |
private static final int | NEW | 任务初始化状态 |
private static final int | COMPLETING | 任务已经完成,但结果还没有赋值给outcome |
private static final int | NORMAL | 任务执行完成 |
private static final int | EXCEPTIONAL | 任务执行异常 |
private static final int | INTERRUPTING | 任务被中断中 |
private static final int | INTERRUPTED | 任务被中断 |
构造函数及方法
通过传入Callable来构造一个任务
public FutureTask(Callable<V> callable) {
if (callable == null)
throw new NullPointerException();
this.callable = callable;
this.state = NEW; // ensure visibility of callable
}
通过传人Runnable来构造一个任务
public FutureTask(Runnable runnable, V result) {
this.callable = Executors.callable(runnable, result);
this.state = NEW; // ensure visibility of callable
}
以上是两个构造函数,有构造函数可知,回家传入参数转换成Callable,然后放到callable变量里,将任务执行状态置为NEW。
公共方法概要如下:
修饰符 | 方法 | 描述 |
---|---|---|
boolean | cancel(boolean mayInterruptIfRunning) | 取消或者中断任务(true为中断,false为取消) |
V | get() | 返回执行结果,当为完成执行时,则阻塞线程 |
V | get(long timeout, TimeUnit unit) | 获得执行结果,当时间超出设定时间时,则返回超时 |
boolean | isCancelled() | 返回任务是否已经取消 |
boolean | isDone() | 判断任务是否执行完毕 |
执行状态转换
执行任务时可能有4种状态转换:
1. 任务顺利执行:NEW -> COMPLETING -> NORMAL
2. 任务执行异常:NEW -> COMPLETING -> EXCEPTIONAL
3. 任务取消:NEW -> CANCELLED
4. 任务中断:NEW -> INTERRUPTING -> INTERRUPTED