Future模式

Future模式:

  什么是Future模式?可以举一个我们开发经常用到的技术,Ajax技术。当用户在页面发送请求后,系统会自动的去后台处理,用户可以不用一直傻傻的在等待结果是什么,可以去继续去操作其他的内容。也可以用我们网购商品来解释,当我们下单后,当平台处理完我们的订单后,接下来就只需要在家等候商品送上门就可以了。

流程见下图:

当客户端Future发送请求的时候,首先它会到服务程序Future那里获取它的包装类,然后就返回给它的客户端Future,此时的包装类中是没有数据的。接着服务程序Future会偷偷的向DataFuture发送请求,然后将其数据封装到之前的包装类中。此时当用户使用到该数据的时候就可以操作了。

其模式的核心图如下:

可以使用下面代码模拟一下这个流程:

public class FutureMain {

    public static void main(String[] args) {

        String request="小明";//请求参数
        FutureClient futureClient=new FutureClient();

        Data date=futureClient.request(request);

        System.out.println("已经发送请求");


       String result= date.getRequest();
        System.out.println(result);


    }
}
public interface Data {
    public String getRequest();
}
public class FutureClient {


    public  Data request(final  String str){
        //接收到其参数,先将其对象反回去告诉其受到请求,再开启一个线程处理真正的数据
        final FutureData futureData=new FutureData();

        new Thread( new Runnable(){
            @Override
            public void run() {
                RealData realData=new RealData(str);
                futureData.setRealData(realData);
            }
        } ).start();
        return  futureData;
    }
}
public class FutureData implements Data {

    private  RealData realData;

    private  boolean isRealdate=false;

    public synchronized  void  setRealData(RealData realData){
        //如果已经加载就直接返回
        if(isRealdate){
            return;
        }
        //还没加载的进行加载
        this.realData=realData;
        isRealdate=true;
        //进行通知
        notify();
    }

    @Override
    public synchronized String getRequest() {
        //当没有加载完就让它一直进行阻塞状态
        while (!isRealdate){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        return realData.getRequest();
    }
}

 

 

public class RealData implements Data{
    private String result;

    public RealData(String str) {
        System.out.println("根据"+str+"参数进行处理数据之中.......");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("处理完毕");
        result="操作结果就是这个了";
    }

    @Override
    public String getRequest() {
        return result;
    }
}

 

posted @ 2017-10-31 15:17  静喧  阅读(217)  评论(0编辑  收藏  举报