FutureTask源码分析

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

内容简介:最近在分析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);
    }
}复制代码

先下班了,回去再继续写

四、内部类

五、构造函数

六、方法


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

查看所有标签

猜你喜欢:

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

算法图解

算法图解

[美] Aditya Bhargava / 袁国忠 / 人民邮电出版社 / 2017-3 / 49.00元

本书示例丰富,图文并茂,以让人容易理解的方式阐释了算法,旨在帮助程序员在日常项目中更好地发挥算法的能量。书中的前三章将帮助你打下基础,带你学习二分查找、大O表示法、两种基本的数据结构以及递归等。余下的篇幅将主要介绍应用广泛的算法,具体内容包括:面对具体问题时的解决技巧,比如,何时采用贪婪算法或动态规划;散列表的应用;图算法;K最近邻算法。一起来看看 《算法图解》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码