并行程序设计模式-future模式

future模式概念

客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订单,不是商品本身),用户也无需等待,先去执行其他的若干操作后,再去调用服务器已经完成组装的真实数据。该模型充分利用了等待的时间片段。

传统的获取数据的方式

这里写图片描述

使用future模式的数据获取方式

这里写图片描述

代码结构

这里写图片描述

类图
这里写图片描述

这里写图片描述

代码

package test;

public class RealData implements Data {

    protected  String result ;

    public RealData(String param)  {

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < 10; i++) {
            sb.append(param);
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        result = sb.toString();
    }

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

}
package test;

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();

        //一开始直接返回future,将耗时的初始化操作放到线程中执行
        return future;


    }


}
package test;

public interface Data {

    public String getResult();
}
package test;

public class FutureData implements Data {

    private RealData realData = null;

    private boolean isReady = false;

    public synchronized void setRealData(RealData realData) {

        System.out.println("进入FutureData的setRealData()");

        while (isReady) {
            return;
        }

        this.realData = realData;
        isReady = true;
        notifyAll();

        System.out.println("执行了notifyAll()");
    }

    @Override
    public synchronized String getResult() {

        System.out.println("进入FutureData的getResult()");
        while (!isReady) {
            try {
                System.out.println("执行了wait()");
                wait();
                System.out.println("唤配了wait()");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //真实数据构造完成后,再获取真实数据的结果
        return realData.result;

    }

}
package test;

public class FutureTest {

    public static void main(String[] args) {

        Client client = new Client();
        Data data = client.request("param");

        //一段长时间的业务逻辑,可以处理其他事情
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("real Data:"+data.getResult());


    }

}

运行FutureTest ,输出:
进入FutureData的getResult()
执行了wait()
进入FutureData的setRealData()
执行了notifyAll()
唤配了wait()
real Data:paramparamparamparamparamparamparamparamparamparam

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值