博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Future模式
阅读量:7218 次
发布时间:2019-06-29

本文共 2763 字,大约阅读时间需要 9 分钟。

什么是Future模型:

该模型是将异步请求和代理模式联合的模型产物。类似商品订单模型。见下图:

客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据,程序先去执行其他的操作后,再去调用服务器已经完成组装的真实数据。该模型充分利用了等待的时间片段。

Future模式的核心结构:

Main:启动系统,调用Client发出请求;

FutureClient:返回Data对象,理解返回FutureData,并开启ClientThread线程装配RealData;

Data:返回数据的接口;

FutureData:Future数据,构造很快,但是是一个虚拟的数据,需要装配RealData;

RealData:真实数据,构造比较慢。

代码实例

/** * @author mouliu * @create 2018-04-07-下午9:30 */public interface Data {    String getRequest();}复制代码
/** * @author mouliu * @create 2018-04-07-下午9:31 */public class RealData implements Data {    private String result;    @Override    public String getRequest() {        return result;    }    public RealData(String queryStr){        System.out.println("根据" + queryStr + "进行查询,这是一个很耗时的操作..");        try {            Thread.sleep(5000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("操作完毕,获取结果");        result = "查询结果";    }}复制代码
/** * @author mouliu * @create 2018-04-07-下午9:33 */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;        //进行通知        this.notify();    }    @Override    public String getRequest() {        //如果没有状态好,程序就一直处于堵塞状态        while (!isReady){            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        return this.realData.getRequest();    }}复制代码
public class FutureClient {    public Data request(final  String querStr){        //1 我想要一个代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经接收到,可以做其他的事情        final  FutureData futureData = new FutureData();        //2 启动一个新的线程,去加载真实的数据,传递给这个代理对象        new Thread(new Runnable() {            @Override            public void run() {                //3 这个新的线程可以去慢慢的加载真实对象,然后传递给代理对象                RealData realData = new RealData(querStr);                futureData.setRealData(realData);            }        }).start();        return futureData;    }}复制代码
public class Main {    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);    }}复制代码

   FutureData是RealData的包装,对真实数据的一个代理,封装了获取真实数据的等待过程。它们都实现了共同的接口,所以,针对客户端程序组是没有区别的;

客户端在调用的方法中,单独启用一个线程来完成真实数据的组织,这对调用客户端的main函数式封闭的;

因为咋FutureData中的notifyAll和wait函数,主程序会等待组装完成后再会继续主进程,也就是如果没有组装完成,main函数会一直等待。

转载于:https://juejin.im/post/5acacb6651882555712ca5c5

你可能感兴趣的文章
java环境配置正确,但是tomcat不能启动的解决办法
查看>>
我就是想找个人聊聊天,说说我这近四年来的经历
查看>>
不同的测试方法使用的场景
查看>>
Hadoop快速入门
查看>>
Problem S
查看>>
SVN上传的时候没法显示文件名,只显示后缀名
查看>>
Python:pygame游戏编程之旅四(游戏界面文字处理)
查看>>
fedroa 编译安装mysql5.5
查看>>
WC2018游记
查看>>
毕设开发日志2017-10-23
查看>>
***微信公众平台开发: 获取用户基本信息+OAuth2.0网页授权
查看>>
第二章 例题2-2 在屏幕上显示两个短句
查看>>
【转】iOS学习之适配iOS10
查看>>
OC语言BLOCK和协议
查看>>
C++创建一个动态链接库工程
查看>>
(六)maven之本地仓库
查看>>
如何使用 SPICE client (virt-viewer) 来连接远程虚拟机桌面?
查看>>
CentOS7
查看>>
linux高编IO-------tmpnam和tmpfile临时文件
查看>>
微信的机器人开发
查看>>