Future设计模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Future设计模式相关的知识,希望对你有一定的参考价值。

序言
有时候会遇到一种情况,当流程到了某个一个节点的时候,数据处理需要花费比较长的时间。只是在最后返回成功或者失败的时候体现,数据处理的结果并不影响后面流程的进展,现在介绍一种设计模式来充分利用时间片段,这个设计模式就是-Future设计模式。
之前的流程图
技术分享图片
上图显示的是一个串行程序调用的流程,可以看出当有一个程序执行的操作比较耗时的时候,后面的程序必须等待该模块的执行完成,才能继续往下执行。
Future的设计模式流程图
技术分享图片
Future的设计模式可以看出,主线程直接跳过了耗时的子线程,整个流程没有长时间的等待操作,充分利用了耗时的时间片段,提高了系统的执行效率,与用户的体验。
每个角色说一下
1、Main:启动系统,调用Client发出请求;
2、Client:返回Data对象,理解返回FutureData,并开启ClientThread线程装配RealData;
3、Data:返回数据的接口;
4、FutureData:Future数据,构造很快,但是是一个虚拟的数据,需要装配RealData;
5、RealData:真实数据,构造比较慢。
三、Future模式的代码实现:

(1)Main函数:

[java] view plain copy
<span style="font-size:18px;">package tgb;

public class Main {

public static void main(String[] args){  
    Client client = new Client();  
    //理解返回一个FutureData  
    Data data = client.request("name");  
    System.out.println("请求完毕!");  

    try{  

        //处理其他业务  
        //这个过程中,真是数据RealData组装完成,重复利用等待时间  
        Thread.sleep(2000);           

    }catch (Exception e){  

    }  

    //真实数据  
    System.out.println("数据 = "+ data.getResult());  

}  

}
</span>
(2)Client的实现:

[java] view plain copy
<span style="font-size:18px;">package tgb;

public class Client {

public Data request(final String queryStr){  
    final FutureData future = new FutureData();  
    //开启一个子线程来构造真实数据  
    new Thread(){  
        public void run(){  
            RealData realData = new RealData(queryStr);  
            future.setRealData(realData);           }  
    }.start();  
    return future;  
}  

}
</span>

(3)Data的实现:

[java] view plain copy
<span style="font-size:18px;">package tgb;

public interface Data {

public  String getResult();  

}
</span>

(4)FutureData:

[java] view plain copy
<span style="font-size:18px;">package tgb;

/**

  • 是对RealData的一个包装
  • @author Godfather
  • */
    public class FutureData implements Data {

    protected RealData realData =null;
    protected boolean isReady = false;
    public synchronized void setRealData(RealData realData){
    if(isReady){
    return;
    }
    this.realData=realData;
    isReady=true;
    notifyAll();

    }

    @Override
    public synchronized String getResult() {
    while(!isReady){
    try{
    wait();
    }catch (Exception e){

        }  
    }  
    return realData.result;  

    }

}
</span>

(5)RealData实现:

[java] view plain copy
<span style="font-size:18px;">package tgb;

public class RealData implements Data {
protected String result;

public RealData(String para){  
     //耗时的操作   用Thread.sleep代替一下
    StringBuffer sb= new StringBuffer();  
    for(int i=0;i<10;i++){  
        sb.append(para);  
        try{  
            Thread.sleep(1000);  
        }catch(Exception e){  

        }  
        result= sb.toString();  
    }  
}  

@Override  
public String getResult() {  

    return result;  
}  

}
</span>
注意:
注意真正处理的代码是 RealData ,所以当 RealData抛出异常的时候,一定要注意处理!具体怎么处理就要看业务场景了。

以上是关于Future设计模式的主要内容,如果未能解决你的问题,请参考以下文章

多线程手写Future模式

多线程设计模式——Read-Write Lock模式和Future模式分析

Java 多线程中的Future

Future模式理解及FutureTask应用场景

Java深入学习:Future模式

多线程之Future模式