Welcome 微信登录

首页 / 软件开发 / JAVA / 深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现

深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现2011-09-07 BlogJava vincent接深入浅出多线程(2)在多线程交互的中,经常有一个线程需要得到另个一 线程的计算结果,我们常用的是Future异步模式来加以解决。

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

在没有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");
}
}