zoukankan      html  css  js  c++  java
  • 架构师养成记--9.future模式讲解

      什么是future模式呢?解释这个概念之前我们先来了解一个场景吧,财务系统的结账功能,这个功能可能是每个月用一次,在这一个月中相关的数据量已经积累得非常大,这一个功能需要调用好几个存储过程来完成。假如要调用5个存储过程,每个存储过程要执行5分钟左右,那么这5个加起来就要25分钟。现在用户要求优化,把结账功能的时间控制在10分钟之内,那么该怎么做呢?解决方案就是将5个存储过程按照业务划分成几个组,这几个组并行执行。其实也就类似ajax的异步请求,主线程可以做其他的事情,耗时的业务让子线程去完成,子线程完成后将数据放在指定的地方,主线程需要的时候再去指定的地方去拿数据。下面代码中FutureData 巧妙地使用了wait和notify方法来保证数据的获取与加载的协调性。

    public class FutureClient {
    
        public Data request(final String queryStr){
            //1 我想要一个代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经接收到,可以做其他的事情
            final FutureData futureData = new FutureData();
            //2 启动一个新的线程,去加载真实的数据,传递给这个代理对象
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //3 这个新的线程可以去慢慢的加载真实对象,然后传递给代理对象
                    RealData realData = new RealData(queryStr);
                    futureData.setRealData(realData);
                }
            }).start();
            
            return futureData;
        }
        
    }
    public interface Data {
    
        String getRequest();
    
    }
    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 getRequest() {
            //如果没装载好 程序就一直处于阻塞状态
            while(!isReady){
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //装载好直接获取数据即可
            return this.realData.getRequest();
        }
    
    
    }
    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 = "查询结果";
        }
        
        @Override
        public String getRequest() {
            return result;
        }
    
    }
  • 相关阅读:
    codevs 1164 统计数字
    codevs 2597 团伙
    codevs 1472 体检
    Openjudge 1.13-21:最大质因子序列
    Openjudge 1.13-23:区间内的真素数
    codevs 1388 砍树
    codevs 1536 海战
    codevs 3110 二叉堆练习3
    codevs 2879 堆的判断
    Openjudge 1.13.37:乒乓球
  • 原文地址:https://www.cnblogs.com/sigm/p/6221946.html
Copyright © 2011-2022 走看看