JDK并发包 - FutureTask

1. FutureTask

FutureTask实现了Runnable和Future接口,它主要用于包装真实callable或runnable的task,其run方法内运行包装的task,同时实现的Future接口可获取包装的task的结果。
在JUC提供的线程池实现中,submit方法提交callable或runnable任务,返回future用于异步获取任务结果,实际实现就是将任务包装成FutureTask,然后返回。

下图是FutureTask的状态变迁。


JDK并发包 - FutureTask_第1张图片
FutureTask.png

其中圆圈表示用于表示FutureTask的状态,一开始的状态为New,进入红色状态表示此时调用get会立即返回(Normal则task正常结束返回结果,Exceptional表示任务异常结束,Interupting和Interuptted表示任务取消了)。

无论任何方式结束,FutureTask结束时都会调用finishCompletion唤醒所有因为调用get阻塞的线程,然后调用done.

done方法是一个空方法,用于可以继承FutureTask实现done方法用于在任务结束时做一些处理。比如:

  1. guava的ListenableFutureTask能够在任务结束时调用listener从而实现异步非阻塞方式获取结果,这里listener的执行就是通过实现FutureTask # done在其中调用listener实现的。

你可能感兴趣的:(JDK并发包 - FutureTask)