zoukankan      html  css  js  c++  java
  • Future模式

    Future模式有点类似于商品订单。比如在网购时,当看中某一件商品时,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。

    或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无需一直等待请求的结果,可以继续浏览或者操作其他内容。

    代码实现:

    package com.future;
    
    public interface Data {
        String getRequest();
    }
    package com.future;
    
    public class RealData implements Data{
    
        private String result ;
        
        public RealData (String queryStr){
            System.out.println("根据" + queryStr + "进行查询,这是一个很耗时的操作..");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("操作完毕,获取结果");
            result = "查询结果";
        }
        
        public String getRequest() {
            return result;
        }
    
    }
    package com.future;
    
    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();
        }
        
        public synchronized String getRequest() {
            //如果没装载好,程序就一直处于阻塞状态
            if(!isReady){
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return this.realData.getRequest();
        }
    }
    package com.future;
    
    public class FutureClient {
        
        public Data request(final String queryStr){
            // 客户端请求,这时候只需要创建一个包装对象先返回给客户端
            final FutureData futureData = new FutureData(); 
            // 启动一个新的线程,去加载真实的数据,传递给这个代理对象
            new Thread(
                    new Runnable() {
                        public void run() {
                            //在这个线程里可以慢慢的加载真实对象,然后传递给代理对象
                            RealData realData = new RealData(queryStr);
                            futureData.setRealData(realData);
                        }
                    }
                    ).start();
            //先把new出来的对象返回去
            return futureData;
        }
        
        
        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);
            
        }
    }
  • 相关阅读:
    Flutter form 的表单 input
    FloatingActionButton 实现类似 闲鱼 App 底部导航凸起按钮
    Flutter 中的常见的按钮组件 以及自 定义按钮组件
    Drawer 侧边栏、以及侧边栏内 容布局
    AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换 通过TabController 定义TabBar
    清空路由 路由替换 返回到根路由
    应对ubuntu linux图形界面卡住的方法
    [转] 一块赚零花钱
    [转]在树莓派上搭建LAMP服务
    ssh保持连接
  • 原文地址:https://www.cnblogs.com/dongdone/p/5746533.html
Copyright © 2011-2022 走看看