Future模式

Future模式有点类似于商品订单。比如在网购时,当看中某一件商品时,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。

或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无需一直等待请求的结果,可以继续浏览或者操作其他内容。

代码实现:

package com.future;

public interface Data {
    String getRequest();
}

 

 

package com.future;

public class RealData implements Data{

    private String result ;
    
    public RealData (String queryStr){
        System.out.println("根据" + queryStr + "进行查询,这是一个很耗时的操作..");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("操作完毕,获取结果");
        result = "查询结果";
    }
    
    public String getRequest() {
        return result;
    }

}
package com.future;

public class FutureData implements Data{
    /**
     * 这个是真实数据的代理对象
     * 和真实数据对象实现相同的接口,并且持有真实数据对象的引用
     */
    
    private RealData realData;
    
    private boolean isReady = false;
    
    public synchronized void setRealData(RealData realData){
        //如果已经装载完毕了,就直接返回 
        if(isReady){
            return;
        }
        //装载真实的对象
        this.realData = realData;
        isReady = true;
        //进行通知
        notify();
    }
    
    public synchronized String getRequest() {
        //如果没装载好,程序就一直处于阻塞状态
        if(!isReady){
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return this.realData.getRequest();
    }
}
package com.future;

public class FutureClient {
    
    public Data request(final String queryStr){
        // 客户端请求,这时候只需要创建一个包装对象先返回给客户端
        final FutureData futureData = new FutureData(); 
        // 启动一个新的线程,去加载真实的数据,传递给这个代理对象
        new Thread(
                new Runnable() {
                    public void run() {
                        //在这个线程里可以慢慢的加载真实对象,然后传递给代理对象
                        RealData realData = new RealData(queryStr);
                        futureData.setRealData(realData);
                    }
                }
                ).start();
        //先把new出来的对象返回去
        return futureData;
    }
    
    
    public static void main(String[] args) {
        
        FutureClient fc = new FutureClient();
        Data data = fc.request("请求参数");
        System.out.println("请求发送成功");
        System.out.println("做其他的事情...");
        
        String result = data.getRequest();
        System.out.println(result);
        
    }
}

 

posted @ 2016-08-07 16:43  dongdone  阅读(373)  评论(0编辑  收藏  举报