本文基于 JDK 1.8.0_101 对应的源码。
FutureTask
表示一个可取消的异步计算的任务,其构造器接收一个 Runnable/Callable
表示异步计算的任务。虽然说 FutureTask
支持取消,但任务一旦开始执行,执行过程就可能不受取消操作的影响。
当任务没有执行结束时,所有获取结果的操作都会阻塞等待。
以栈的方式维护等待获取结果的线程,因为不用考虑公平性的问题,用栈更简单。
FutureTask 在 JDK 1.7 的时候是基于 AQS 实现的,可以看这里。
总体上:
volatile int state
控制执行状态,volatile Thread runner
防止重复执行,volatile WaitNode waiters
以栈形式维护等待线程。