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

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

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;    }}

 

转载于:https://www.cnblogs.com/jxgo/p/7761697.html

你可能感兴趣的文章
局域网PING不通原因是什么?解决ping不通局域网电脑
查看>>
泄露们事件
查看>>
springmvc提交带日期的表单400
查看>>
我的友情链接
查看>>
使用Python socket获取本机ip
查看>>
java 简单的加解密操作
查看>>
qmake 之 CONFIG 与 QT 乱谈
查看>>
ExtJS 创建动态加载树
查看>>
我的友情链接
查看>>
tensorflow入门简单卷积神经网络
查看>>
我的友情链接
查看>>
the dude 使用教程和一点感觉
查看>>
Spring4+Hibernate4 注解整合配置
查看>>
螺旋数字程序
查看>>
Pyhton 第九章 正则表达式
查看>>
mysql主从配置
查看>>
Jconsole远程监控tomcat 的JVM内存(linux、windows)
查看>>
分布式项目(一)iot-pt
查看>>
JFreeChart开源图表组件在Java开发中的应用(一)
查看>>
使用ZooKeeper ACL特性进行znode控制
查看>>