快速业务通道

深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现

时间:2011-09-07 BlogJava vincent

接深入浅出多线程(2)在多线程交互的中,经常有一个线程需要得到另个一 线程的计算结果,我们常用的是Future异步模式来加以解决。

什么是Future模式呢?Future 顾名思义,在金融行业叫期权,市场上有看跌 期权和看涨期权,你可以在现在(比如九月份)购买年底(十二月)的石油,假 如你买的是看涨期权,那么如果石油真的涨了,你也可以在十二月份依照九月份 商定的价格购买。扯远了,Future就是你可以拿到未来的结果。对于多线程,如 果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿 到一个未来的Future,等B有结果是再取真实的结果。其实这个模式用的很多, 比如浏览器下载图片的时候,刚开始是不是通过模糊的图片来代替最后的图片, 等下载图片的线程下载完图片后在替换。如图所示:

深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现 - 编程入门网

在没有JDK1.5提供的Concurrent之前,我们通过自定义一个结果类,负责结 果持有。

如下面代码:

package vincent.blogjava.net; public class FutureResult { private String result; private boolean isFinish =false; public String getResult() { return result; } public synchronized void setResult(String result) { this.result = result; this.isFinish = true; } public synchronized boolean isFinish() { return isFinish; } }

存储结果值和是否完成的Flag。

package vincent.blogjava.net; public class GenerateResultThread extends Thread{ FutureResult fr ; public GenerateResultThread(FutureResult fr ){ this.fr = fr; } public void run(){ //模仿大量耗时计算后(5s)返回结果。 try { System.out.println("GenerateResultThread开始进行计算了! "); Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } fr.setResult("ResultByGenerateResultThread"); } }

深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现(2)

时间:2011-09-07 BlogJava vincent

计算具体业务逻辑并放回结果的线程。

package vincent.blogjava.net; public class Main { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub FutureResult fr = new FutureResult(); new GenerateResultThread(fr).start(); //main线程无需等待,不会被阻塞。 //模仿 干自己的活 2s。 Thread.sleep(2000); // 估计算完了吧 取取试试。 System.out.println("过来2s了,看看有结果吗?"); if(!fr.isFinish()){System.out.println("还没有完成呢! 继续干自己 活吧!");} //模仿 干自己的活 4s。 Thread.sleep(4000); System.out.println("过来4s了,看看有结果吗?"); if(fr.isFinish()){ System.out.println("完成了!"); System.out.println("Result:"+fr.getResult()); } } }

Main方法需要GenerateResultThread线程计算的结果,通过这 种模式,main线程不需要阻塞。结果如下:

GenerateResultThread开始进行计算了!

过来2s了,看看有结果吗?

还没有完成呢! 继续干自己活吧!

过来4s了,看看有结果吗?

完成了!

深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现(3)

时间:2011-09-07 BlogJava vincent

Result:ResultByGenerateResultThread

在JDK1.5 Concurrent 中,提供了这种Cal

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号