FutureTask源码分析

1、简介

        最近在分析Executor框架源码体系,先从FutureTask类开始介绍,在Executor框架体系中,FutureTask用来表示可获取结果的异步任务。FutureTask实现了Future接口和Runnable,FutureTask提供了查询异步任务是否计算结束以及获取最终的异步任务的结果以及取消异步任务的一些经常使用的方法,源码对应的jdk版本是1.8。
java

2、类关系

                            

  1.  Future类

    public interface Future<V> {
        //提供取消任务的抽象方法
        boolean cancel(boolean mayInterruptIfRunning);
    
        //提供判断任务是否取消的抽象方法
        boolean isCancelled();
        
        //提供判断任务是否完成的抽象方法
        boolean isDone();
        
        //提供获取异步任务的执行结果的抽象方法,会抛出中断异常和执行时异常
        V get() throws InterruptedException, ExecutionException;
        
        //提供超时的获取异步任务的执行结果的抽象方法,会抛出中断异常、超时异常、执行时异常
        V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
    }     复制代码
  2.  Runnable类

    //函数式接口,不清楚的看下个人另外一篇函数式接口介绍https://juejin.im/post/5c7d1254e51d45720f72264c
    @FunctionalInterface
    public interface Runnable {
        //只有一个run方法
        public abstract void run();
    }复制代码

  3. RunnableFuture类

    //实现于Runnable、Future接口
    public interface RunnableFuture<V> extends Runnable, Future<V> {
        void run();
    }复制代码

        

3、成员变量

//state是FutureTask的状态,任务的状态,state状态流转存在4种状况
//任务顺利执行:NEW -> COMPLETING -> NORMAL
//任务执行异常:NEW -> COMPLETING -> EXCEPTIONAL
//任务取消:NEW -> CANCELLED
//任务中断:NEW -> INTERRUPTING -> INTERRUPTED
private volatile int state;
//任务初始化状态
private static final int NEW          = 0;
//任务已经完成,但结果尚未被赋值给outcome,COMPLETING在下面的介绍set方法和setException方法中会看到,属于中间态
private static final int COMPLETING   = 1;
//任务正确执行完成的状态,属于终态
private static final int NORMAL       = 2;
//任务执行出现异常的状态,属于终态
private static final int EXCEPTIONAL  = 3;
//任务在NEW状态调用cancel方法的取消状态,下面cancel方法会介绍到,属于终态
private static final int CANCELLED    = 4;
//任务被中断中的状态,即线程Thread还没调用interrupt方法前的状态,属于中间态
private static final int INTERRUPTING = 5;
//即线程Thread调用interrupt方法后的状态,属于终态
private static final int INTERRUPTED  = 6;
//任务的执行体
private Callable<V> callable;
//最终输出结果,任务正确执行完的最终结果,或者任务执行出现异常的异常对象
private Object outcome;
//执行当前任务的线程
private volatile Thread runner;
//等待队列,当前任务在其余线程中还没执行完,其余线程调用当前FutureTask对象的get方法,会将其线程阻塞起来,包装成队列,好比有个FutureTask在线程t中执行,还未执行完(COMPLETING状态以前才会阻塞,在下面的await),主线程调用此任务的get方法
private volatile WaitNode waiters;

private static final sun.misc.Unsafe UNSAFE;
private static final long stateOffset;
private static final long runnerOffset;
private static final long waitersOffset;
static {
    try {
        UNSAFE = sun.misc.Unsafe.getUnsafe();
        Class<?> k = FutureTask.class;
        stateOffset = UNSAFE.objectFieldOffset
            (k.getDeclaredField("state"));
        runnerOffset = UNSAFE.objectFieldOffset
            (k.getDeclaredField("runner"));
        waitersOffset = UNSAFE.objectFieldOffset
            (k.getDeclaredField("waiters"));
    } catch (Exception e) {
        throw new Error(e);
    }
}复制代码

先下班了,回去再继续写框架

4、内部类

5、构造函数

6、方法

相关文章
相关标签/搜索