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

来源:互联网 发布:大数据 宣传片 脚本 编辑:程序博客网 时间:2024/06/05 19:32

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

原创粉丝点击