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);
            
        }
    }
  • 相关阅读:
    windows RabbitMQ Server 环境配置中的一些坑
    Redis自定义fastJson Serializer
    如何使用Feign构造多参数的请求
    跨域访问支持(Spring Boot、Nginx、浏览器)
    chrome浏览器的跨域设置
    Jenkins手把手图文教程[基于Jenkins 2.164.1]
    Spring Boot 2发送邮件手把手图文教程
    poi读取Excel模板并修改模板内容与动态的增加行
    Lock类-ReentrantLock的使用
    类ThreadLocal的使用与源码分析
  • 原文地址:https://www.cnblogs.com/dongdone/p/5746533.html
Copyright © 2011-2022 走看看