【并发编程】Future和FutureTask以及CompletionService
2016-04-25 17:15
417 查看
Future接口
![](https://images2015.cnblogs.com/blog/731047/201702/731047-20170209094131713-1430936994.png)
此接口主要用于:代表异步计算的执行结果;
用于可取消的task;(比使用interrupt实现取消要方便 )
![](https://images2015.cnblogs.com/blog/731047/201702/731047-20170209094132119-1735121283.png)
FutureTask类
FutureTask是Future的一个实现类;类图层次结构如下:![](https://images2015.cnblogs.com/blog/731047/201702/731047-20170209094132338-1283633537.png)
FutureTask任务的创建--通过构造函数
在java的并发模型中,表示Task的类主要有如下几个(其中Callable和Runnable是最基本的):Callable;Runnable;
Future;
![](https://images2015.cnblogs.com/blog/731047/201702/731047-20170209094132557-1008831322.png)
![](https://images2015.cnblogs.com/blog/731047/201702/731047-20170209094132791-1942703736.png)
其中Callable和Runnable接口的主要区别在于:
Callable可以有返回值,且可以抛出异常;
Runnable没有返回值,且不抛出异常;
FutureTask任务的创建,可以通过Callable和Runnable两个任务类进行创建,即对Callable和Runnable进行封装,见下面的构造函数:
![](https://images2015.cnblogs.com/blog/731047/201702/731047-20170209094133041-505885903.png)
![](https://images2015.cnblogs.com/blog/731047/201702/731047-20170209094133291-159078911.png)
get():过去异步计算的结果
(有时间待完善。。。)done():异步计算完成后调用的回调函数 ==>CompletionService
可在FutureTask子类中实现该方法,以实现一些额外的功能,如:![](https://images2015.cnblogs.com/blog/731047/201702/731047-20170209094133901-25108434.png)
Java类库中,有一个类的功能,就是基于此done()方法来实现的,该类中包括两个重要的属性:Executor;==>用于提交任务使用
BlockingQueue; ==>当任务完成后,会将task对应的Future保存起来;
![](https://images2015.cnblogs.com/blog/731047/201702/731047-20170209094134619-594554029.png)
具体实现步骤如下:Callable或Runnable任务 ===> RunnableFuture ===> QueueingFuture1.newTaskFor():[/b] 将Callable和Runnable任务封装为:RunnableFuture
![](https://images2015.cnblogs.com/blog/731047/201702/731047-20170209094134916-1406106673.png)
2. 使用FutureTask的done():提交task到BlockingQueue ==>实现“生产者-消费者
![](https://images2015.cnblogs.com/blog/731047/201702/731047-20170209094135197-426971500.png)
3. 使用executor来提交任务;
![](https://images2015.cnblogs.com/blog/731047/201702/731047-20170209094135463-1850307071.png)
通过上面3个步骤,一个Callable或Runnable任务在执行完成后,都会被添加到BlockingQueue中,此时就可以实现生产者和消费者模式;
![](https://images2015.cnblogs.com/blog/731047/201702/731047-20170209094136088-458893294.png)
有时间补充。。。。
来自为知笔记(Wiz)
附件列表
Future.png相关文章推荐
- C++模板的坑
- Idea15 常用设置(一):JDK、SVN
- Python常用标准库操作
- python md5
- python的setdefault方法
- ThreadLocal in java
- ruby 除法运算
- java生成pdf文件
- [javaSE] 看博客学习java并发编程
- ubuntu系统启动qtceator时提示:Qt5.5.1/Tools/QtCreator/lib/qtcreator/plugins/libHelp.so: 无法加载库
- Java threadpool机制深入分析
- Matlab GUIDE 控件使用总结
- C/C++ 打印文件名、行号、函数名的方法
- eclipse最有用快捷键整理
- [改善Java代码]在equals中使用getClass进行类型判断
- php中实现精确设置session过期时间的方法
- 使用GDB调试Android NDK native(C/C++)程序
- python读取excel文件生成sql文件
- Java.接口
- python modules下载地址