JDK并发包 - FutureTask

1. FutureTask

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

下图是FutureTask的状态变迁。


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实现的。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容