FutureTask实现一个可以取消的异步计算任务。
FutureTask的同步控制有内部类Sync负责;使用AQS的sync state表示运行状态。
FutureTask的状态:
- RUNNING =1: 表示任务正在运行
- RAN =2: 表示任务已经运行结束
- CANCELLED =4: 表示任务被取消
- 任务创建时,state = 0
FutureTask的同步操作发生在:
- get()/get(timeout, TimeUnit) 等待任务执行结束;
- 同步控制采用共享模式:重写并支持AQS的 tryAcquireShare() /tryReleaseShare()
- 释放并唤醒等待线程:设置结果innerSet()/取消任务innerCancel()/设置任务异常innerSetException()
唤醒同步的时间点:任务执行结束innerRun()/任务取消innerCancel()/任务发生异常innerRun()或innerRunAndReset()调用innerSetException()方法
FutureTask中get()/get(timeout, TimeUnit)同步线程执行时,分别调用AQS方法:acquireSharedInterruptibly()/tryAcquireSharedNanos()
FutureTask中唤醒等待线程时,调用AQS方法:releaseShared()
FutureTask提供回调方法done() : 该方法在任务执行完成/任务取消/任务发生异常时回调;ExecutorCompletionService中任务QueueingFuture实现该方法,在任务完成时回调以将结果存入阻塞队列
FutureTask中任务多次执行方法:runAndReset() 执行任务但不设置任务执行结果,之后重置FutureTask为初始状态(state=0); 如果任务执行异常或者任务被取消,则任务无法再次执行; PS:此方法支持ScheduledFutureTask周期任务重复执行