zoukankan      html  css  js  c++  java
  • 28_Future模式1

    【Future模式】

    Future模式类似商品订单。比如在网购时,当看中一件商品时,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者类似我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无需一直等待请求的结果,可以继续浏览或操作其他内容。

     

    【Future模式自行代码实现例子】

    //返回数据的接口
    public
    interface Data { String getResult(); }
    //实现Data接口,返回真实数据,构造比较慢
    public
    class RealData implements Data{ private String result; public RealData(String queryStr) { System.out.println("查询"+queryStr+",这个查询非常耗时!!!"); try{ Thread.sleep(5000); }catch (Exception e){ } System.out.println("查询完毕,获取结果"); this.result = "结果是:哈哈哈哈哈哈哈哈"; } @Override public String getResult() { return result; } } //实现Data接口,构造很快,返回一个伪数据,需要装配RealData
    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(); } @Override public synchronized String getResult() { //如果没有装载好,则一直处于阻塞状态 while (!isReady){ try{ wait(); }catch (InterruptedException e){ e.printStackTrace(); } } //装载好,直接获取数据即可 return this.realData.getResult(); } } //立即返回FutureData数据,并开启一个线程去装配RealData数据
    public
    class FutureClient { public Data request(final String queryStr){ //1.想要一个代理对象(Data接口的实现类)先返回发送请求的客户端,告诉他请求已经接收到,可以做其他的事情 final FutureData futureData = new FutureData(); //2.启动一个线程,去加载真实的数据,传递给这个代理对象 new Thread(()-> { //基于java8 //3.这个线程可以慢慢去加载真实对象,然后传递给代理对象 RealData realData = new RealData(queryStr); futureData.setRealData(realData); //等加载好了,再把数据set到futureData中 }).start(); return futureData; } }
    public class Main { public static void main(String[] args) { FutureClient fc = new FutureClient(); Data data = fc.request("id=666"); System.out.println("请求发送成功"); System.out.println("Main线程开始做别的事情"); String result = data.getResult(); System.out.println("result=="+result); } }

    【运行结果】

  • 相关阅读:
    Redis(01)基础知识
    MySQL(05)触发器&事件&事务&锁
    MySQL(04)索引&存储过程
    MySQL(02)DDL&DML
    MySQL(03)表查询
    Go高级编程(01)
    兼容IE8灰色遮罩层处理方法
    AJAX请求跨域的问题
    Sql Server批量删除数据表
    [转]SQL操作日期
  • 原文地址:https://www.cnblogs.com/HigginCui/p/9398882.html
Copyright © 2011-2022 走看看