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);
            
        }
    }
  • 相关阅读:
    python关于字符串数据类型的方法
    python流程控制
    python解释器下载
    (转)蓝牙无线技术配置文件
    Android 编译选项user、userdebug和eng的区别
    (转)android4.0蓝牙使能的详细解析
    (转)Android Bluetooth opp package 学习笔记
    《深入理解Android(卷1)》笔记 1.第二章 深入理解JNI
    (转)Vim知识
    Android之Preference
  • 原文地址:https://www.cnblogs.com/dongdone/p/5746533.html
Copyright © 2011-2022 走看看