futureTask 源码

private static final int NEW          = 0; //任务新建和执行中
private static final int COMPLETING   = 1; //任务将要执行完毕
private static final int NORMAL       = 2; //任务正常执行结束
private static final int EXCEPTIONAL  = 3; //任务异常
private static final int CANCELLED    = 4; //任务取消
private static final int INTERRUPTING = 5; //任务线程即将被中断
private static final int INTERRUPTED  = 6; //任务线程已中断

总结下,FutureTask的状态流转过程,可以出现以下四种情况:

        1. 任务正常执行并返回。 NEW -> COMPLETING -> NORMAL

      2. 执行中出现异常。NEW -> COMPLETING -> EXCEPTIONAL

        3. 任务执行过程中被取消,并且不响应中断。NEW -> CANCELLED

      4. 任务执行过程中被取消,并且响应中断。 NEW -> INTERRUPTING -> INTERRUPTED 

构造器:初始化任务及任务状态new

run:如果任务状态不是NEW,或者添加执行任务线程失败,返回。如果任务不是空,并且任务状态是NEW,启动的线程运行任务,得到结果,如果抛出异常保存异常,否则保存结果。最后,把运行任务线程设置为null,如果任务状态是将要中断,则线程让步,直到状态不是将要中断为止。

setException: 保存异常 如果cas操作修改任务状态为将要完毕成功,保存异常,cas操作修改任务状态为异常,调用完成操作。
set:保存值 如果cas修改任务状态为将要完毕成功,保存结果,cas操作修改任务状态为完毕,调用完成操作。

finishCompletion 完成操作:遍历等待节点线程队列,移除等待节点,唤醒等待节点的线程,最后 清空任务。

get(long timeout, TimeUnit unit) 可超时的获取结果:如果任务状态<=将要完成,调用awaitDone等待完成,返回新的任务状态,如果任务状态<=将要完成,抛出超时异常。最后把任务状态发送给report获取最终结果。

awaitDone(boolean timed, long nanos) 等待:如果线程被中断,则撤销中断在等待节点队列移除等待节点。如果任务状态大于将要完成,则返回任务状态;否则如果任务状态等于将要完成,则线程礼让;否则如果等待节点没有被初始化,则初始化;否则如果等待节点没有入队列,入队列;否则如果允许超时,如果超时返回任务状态,如果没超时挂起线程剩余超时时间;否则挂起线程。

report(int s) 获取结果:如果任务状态为已完成,则返回保存的结果;如果任务状态为已取消,则抛出取消异常;如果任务状态异常,则抛出保存的异常。

cancel 取消操作,如果任务状态不是新建,或者cas修改任务状态为(如果允许运行任务线程中断,则改为将终止,否则为已取消)失败,返回false.如果允许运行任务线程中断,则中断运行任务线程并把任务状态cas改为已终止。最后调用完成操作:遍历等待节点队列,移除节点,唤醒节点线程把任务清空。

猜你喜欢

转载自blog.csdn.net/liangwenmail/article/details/81477587