Java多线程深入学习-FutureTask与Callable实现解析

本文深入探讨Java多线程,详细解析Callable接口、Future接口及其组合使用的RunnableFuture接口,同时对核心类FutureTask的源码进行分析。
摘要由CSDN通过智能技术生成

Callable接口定义

/**
 * 定义一个函数式接口Callable
 */
@FunctionalInterface
public interface Callable<V> {
    /**
     * 定义一个call方法
     */
    V call() throws Exception;
}

Future接口定义

/**
 * 调用不带参数的get方法的调用被阻塞,直到计算完成。
 * 		如果在计算完成之前,调用带参get()方法超时时,会抛出TimeoutException异常。
 * 		若运行该计算的线程被中断,两种get()方法都会抛出InterruptedException。如果计算已经完成,那么get方法立即返回。
 * 若计算还在进行,isDone方法返回false;如果完成了,则返回true。
 * 调用cancel()时,若计算还没有开始,它被取消且不再开始。若计算处于运行之中,那么如果mayInterrupt参数为true,它就被中断。
 * 相比future.get(),其实更推荐使用get (long timeout, TimeUnit unit) 方法,因为设置了超时时间可以防止程序无限制的等待future的返回结果。
 */
public interface Future<V> {

    /**取消任务。参数:是否立即中断任务执行,或者等等任务结束 */
    boolean cancel(boolean mayInterruptIfRunning);
    /** 任务是否已经取消,若已取消,返回true */
    boolean isCancelled();
    /** 任务是否已经完成。包括任务正常完成、抛出异常或被取消,都返回true */
    boolean isDone();
    /** 
     * 等待任务执行结束,获得V类型的结果。
     * 	InterruptedException: 线程被中断异常, 
     * 	ExecutionException: 任务执行异常,
     * 	如果任务被取消,还会抛出CancellationException 
     */
    V get() throws InterruptedException, ExecutionException;
    /**
     * 参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。
     * 如果计算超时,将抛出TimeoutException
     */
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

RunnableFuture接口定义

/** 定义接口 继承 Runnable和 Future*/
public interface RunnableFuture<V> extends Runnable, Future<V> {
    void run();
}

FutureTask源码解析

/**
 * 定义FutureTask类实现RunnableFuture接口
 */
public class FutureTask<V> implements RunnableFuture<V> {
	/** 定义线程状态 以及一些常量 */
    private volatile int state;	// 确保callable的可见性,因为state是volatile修饰的,
    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;	//已中断

    /** callable是计算结果的代码块 也就是执行的代码块 */
    private Callable<V> callable;
    /** callable的计算结果保存在这,这个字段不是volatile的,由state的读写来保护 */
    private Object outcome;
    /** 运行的线程 */
    private volatile Thread runner;
    /** 等待结果的队列 */
    private volatile WaitNode w
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值