FutureTask源码分析

此处移至原文阅读
FutureTask:一个可取消的异步任务执行类,这个类提供了Future接口的基本实现,主要有以下功能:
- 异步执行任务
- 可以开始、取消以及查看任务是否完成
- 如果任务没有执行完,get方法会导致线程阻塞
- 一旦一个执行任务已经完成就不能再次开始和结束(除非执行时通过runAndReset()方法)

类关系

先看一下类关系图:
FutureTask类关系图.jpg
- 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值