深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现
来源:互联网 发布:数码治疗仪 知乎 编辑:程序博客网 时间:2024/06/11 11:40
本系列文章导航
深入浅出Java多线程(1)-方法 join
深入浅出Java多线程(2)-Swing中的EDT(事件分发线程)
深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现
深入浅出多线程(4)对CachedThreadPool OutOfMemoryError难题的一些想法
深入浅出多线程(5)以并行包线程池为例说说线程池的设计需求及使用
深入浅出多线程(6)分析并行包线程池的设计与实现
接深入浅出多线程(2)在多线程交互的中,经常有一个线程需要得到另个一线程的计算结果,我们常用的是Future异步模式来加以解决。
什么是Future模式呢?Future 顾名思义,在金融行业叫期权,市场上有看跌期权和看涨期权,你可以在现在(比如九月份)购买年底(十二月)的石油,假如你买的是看涨期权,那么如果石油真的涨了,你也可以在十二月份依照九月份商定的价格购买。扯远了,Future就是你可以拿到未来的结果。对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果是再取真实的结果。其实这个模式用的很多,比如浏览器下载图片的时候,刚开始是不是通过模糊的图片来代替最后的图片,等下载图片的线程下载完图片后在替换。如图所示:
在没有JDK1.5提供的Concurrent之前,我们通过自定义一个结果类,负责结果持有。
如下面代码:
存储结果值和是否完成的Flag。
计算具体业务逻辑并放回结果的线程。
Main方法需要GenerateResultThread线程计算的结果,通过这种模式,main线程不需要阻塞。结果如下:
GenerateResultThread开始进行计算了!
过来2s了,看看有结果吗?
还没有完成呢! 继续干自己活吧!
过来4s了,看看有结果吗?
完成了!
Result:ResultByGenerateResultThread
在JDK1.5 Concurrent 中,提供了这种Callable的机制。我们只要实现Callable接口中的Call方法,Call方法是可以返回任意类型的结果的。如下:
Returnresult 实现了Callable接口,在Call方法中实现业务逻辑,并返回结果。在Main方法里面,初始化FutureTask 并将该Task作为Runnable加入Thread后,启动线程。得到跟刚才相同的效果。
注意: 通过JDK标准的Future后,没有必要增加额外的Object来只有Result,更加简单明了,同时FutureTask还提供了Cancel的功能,我们持有FutureTask引用后可以Cancel该线程。通过get()取值是,如果结果还没有返回,将会阻塞Main线程。
其实JDK 实现Future模式的秘密就在FutureTask类里:
FutureTask是实现了Future 和Runnable,对了就是Runnbale接口,我们就可以把它构造到Thread里,启动执行了。
看看,当 new Thread(new FutureTask(new Callable())).start 时:
看图:
G
get 方法取result值,FutureTask 提供Timeout 功能,如果超时,抛出异常。
博文来源:http://www.cqzol.com/programming/580434.html
- 深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现
- 深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现
- Java.util.concurrent 包 使用Future,Callable实现抢答模式
- 自己模拟实现Concurrent包下的Future模式
- jdk1.5中java.util.concurrent包编写多线程(一)
- jdk1.5中java.util.concurrent包编写多线程(二)
- jdk1.5中java.util.concurrent包编写多线程(三)
- jdk1.5中java.util.concurrent包编写多线程(四)
- 多线程Future模式简单实现
- Future 模式(异步调用)
- Future 模式(异步调用)
- Future模式(异步调用)
- Promise模式简介(Future) --- Java实现异步
- 异步Future模式理解及实现案例
- Promise模式简介(Future) --- Java实现异步
- Promise模式简介(Future) -Java实现异步
- Java多线程编程-(17)-多线程异步调用之Future模式
- Java多线程编程-(19)-多线程异步调用之Future模式
- Automation for the people: Continuous Inspection
- cygwin下编译ffmpeg ffserver的编译
- WEBLOGIC 10.3 在Windows后台服务中运行
- Java字符串操作的误区
- 在内核态下写入数据到硬盘
- 深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现
- “Cache-control”常见的取值有private、no-cache、max-age、must-revalidate
- sqlite全文查询配置到使用全过程
- 关于面试题的网上资料整理
- MySQL数据库备份和还原的常用命令
- C# 数据缓存操作Cache
- C++语法
- 无线路由WDS无线中继功能详解[转]
- MySQL 备份和恢复