FutureTask源码分析

栏目: 编程工具 · 发布时间: 5年前

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

一、简介

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

二、类关系

FutureTask源码分析

  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();
    }复制代码
        

三、成员变量

//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);
    }
}复制代码

先下班了,回去再继续写

四、内部类

五、构造函数

六、方法


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ANSI Common Lisp

ANSI Common Lisp

Paul Graham / Prentice Hall / 1995-11-12 / USD 116.40

For use as a core text supplement in any course covering common LISP such as Artificial Intelligence or Concepts of Programming Languages. Teaching students new and more powerful ways of thinking abo......一起来看看 《ANSI Common Lisp》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具