先来看下Future接口特性
public interface Future<V> {
boolean cancel(boolean var1); // 取消任务
boolean isCancelled(); // 判断是否取消
boolean isDone(); // 判断是否完成
V get() throws InterruptedException, ExecutionException; // 获取返回值, 并且可以抛异常
V get(long var1, TimeUnit var3) throws InterruptedException, ExecutionException, TimeoutException; // 指定时间内获取返回值, 并且可以抛异常
}
FutureTask实现了RunnableFuture接口
实现Runnable接口, 作用是可以通过new Thread(futureTask).start()的方式执行线程
实现Future接口, 作用是添加Future接口特性
Runnable接口, 只具备run方法线程执行体, 不具备返回值, 抛异常, Future特性
Callable接口, 只具备call方法线程执行体, 具备返回值, 抛异常, 不具备Future特性
使用FutureTask, 目的就是给Runnable和Callable包裹上Future的特性
FutureTask源码解析:
1.FutureTask本身实现了RunnableFuture接口, 并且内部有个成员变量为Callable类型
当创建FutureTask对象时
若传入Callable对象, 则该成员变量就是传入的Callable对象
public FutureTask(Callable<V> callable) {
if (callable == null) {
throw new NullPointerException();
} else {
this.callable = callable;
this.state = 0;
}
}
若传入的是Runnable对象,