1. FutureTask
FutureTask实现了Runnable和Future接口,它主要用于包装真实callable或runnable的task,其run方法内运行包装的task,同时实现的Future接口可获取包装的task的结果。
在JUC提供的线程池实现中,submit方法提交callable或runnable任务,返回future用于异步获取任务结果,实际实现就是将任务包装成FutureTask,然后返回。
下图是FutureTask的状态变迁。
其中圆圈表示用于表示FutureTask的状态,一开始的状态为New,进入红色状态表示此时调用get会立即返回(Normal则task正常结束返回结果,Exceptional表示任务异常结束,Interupting和Interuptted表示任务取消了)。
无论任何方式结束,FutureTask结束时都会调用finishCompletion
唤醒所有因为调用get
阻塞的线程,然后调用done
.
done
方法是一个空方法,用于可以继承FutureTask实现done方法用于在任务结束时做一些处理。比如:
- guava的
ListenableFutureTask
能够在任务结束时调用listener从而实现异步非阻塞方式获取结果,这里listener的执行就是通过实现FutureTask # done在其中调用listener实现的。