FutureTask源码解析
FutureTask是Future的实现类,它实现了RunnableFuture接口,而RunnableFutrue又继承了Runnable和Future接口。
FutureTask可以拆分为Future和Task,Future对应Future接口的相关功能,Task对应Runnabl接口相关功能。因此,可以把FutureTask当做是一个任务,一个简单的Runnable对象。
类图
FutureTask的类图如下所示:
FutureTask实现了RunnableFuture接口
1 | public class FutureTask<V> implements RunnableFuture<V> |
RunnableFuture接口只是继承了Runnable和Future接口,如下:
1 | /** |
主要属性
1 | /** |
主要方法
有参构造函数-指定运行任务
1 | /** |
任务不能为null,状态设置为NEW
有参构造函数-指定任务和成功返回结果
传入要执行的任务和任务执行成功后的结果。将Runnable对象封装为Callable对象。任务执行成功,或者成功结束后,返回传入的result,如果不需要返回结果的话,可以直接传入null
1 | /** |
isCanceled
任务是否取消。状态如果大于等于CANCELLED,就表示已经取消
1 | public boolean isCancelled() { |
isDone
任务状态不为NEW,就表示已经完成
1 | public boolean isDone() { |
cancel
取消当前正在执行的任务。
如果当前任务状态不为NEW,或者设置状态INTERRUPTING(mayInterruptIfRunning = true)或CANCELLED(mayInterruptIfRunning=false)失败,返回false
如果mayInterruptIfRunning设置为true,那么就中断当前线程,在finally中会设置线程的状态为INTERRUPTED
1 | public boolean cancel(boolean mayInterruptIfRunning) { |
finishCompletion
1 | /** |
done
done方法在FutureTask中是一个空实现,使用FutureTask的时候可以重写这个方法
1 | /** |
get
1 | public V get() throws InterruptedException, ExecutionException { |
awaitDone
等待任务完成或者放弃或者中断或者超时。
1 | /** |
removeWaiter
1 | /** |
report
1 | /** |
set
1 | /** |
setException
1 | /** |
run
1 | public void run() { |
handlePossibleCancellationInterrupt
1 | /** |
run方法重点做了以下几件事:
- 将runner属性设置成当前正在执行run方法的线程
- 调用callable成员变量的call方法来执行任务
- 设置执行结果outcome, 如果执行成功, 则outcome保存的就是执行结果;如果执行过程中发生了异常, 则outcome中保存的就是异常,设置结果之前,先将state状态设为中间态
- 对outcome的赋值完成后,设置state状态为终止态(
NORMAL
或者EXCEPTIONAL
) - 唤醒栈中所有等待的线程
- 善后清理(waiters, callable,runner设为null)
- 检查是否有遗漏的中断,如果有,等待中断状态完成。