一,概述
FuturnTask实现了Future与Runnable接口,笔者知道,ThreadPoolExecutor#submit可以传入Callable接口而非Runnable,区别点在于Callable可以返回值,而整个FuturnTask可以理解为Callable设计,用来优雅地异步获取执行结果,无需手动Condition去实现。
围绕此,需知道Future接口及其方法的定义,
cancel:取消此任务,注意不是销毁线程任务,只是让get抛出CancelException异常,参数可以用来标记是否中断Thread。
isCancelled、isDone:状态方法
get:提供两个版本,没有参数版本表示无限制阻塞等待结果,有参数的是超时阻塞等待。
以上即Future接口定义,而直接实现是FutureTask
二,实现原理
1,submit
JUC包中,ExecutorService抽象实现类AbstractExecutorService实现了submit方法,
笔者跟进此方法实现,其余重载有submit(Runnable task),本质是封装为返回默认值的Callable。
从submit实现可知,Callable会被转换为RunnableFuture,随后放入线程池队列执行,那么RunnableFuture实现是什么呢?答案就是FutureTask
既然是线程池,咱们跟进FuturTask#run