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

    根据前面我所说的Futrue模式,手写一个:

    分别对应的Java代码,大家拿来参考:

    package FutureTest;
    
    
    //公共data数据接口
    public abstract class Data {
         //方法作用 返回线程执行结果
        public abstract String getRequest();
    }
    package FutureTest;
    //获取真实数据
    public class RealData extends Data {
       
        private String requestData;
        public RealData(String requestData){
            System.out.println("正在使用data进行网络请求,data"+requestData+"开始");
            try {
                //模拟执行业务逻辑耗时时间
                Thread.sleep(3000);
            } catch (InterruptedException e) {        
                e.printStackTrace();
            }
            System.out.println("操作执行完毕...获取结果");
            //获取返回结果
            this.requestData="结果";
        }
        @Override
        public String getRequest() {
            
            return requestData;
        }
        
    }
    package FutureTest;
    
    //当有线程想要获取RealData时候,程序会被阻塞。等到RealData被注入才会使用getReal()方法
    public class FutureData extends Data{
        
        private boolean FLAG = false;
        private RealData realData;
        //读取data数据
        public synchronized void setRealData(RealData realData){
            //读取结果
             if (FLAG) {  //true 说明已经获取到结果了 如果获取到则直接返回结果
                
            }
             //如果flag是false,没有获取到数据,传递realData对象
             this.realData=realData;
             FLAG=true;  //获取到执行结果 改为true
             notify();//唤醒
        }
        
        
          @Override
        public synchronized  String getRequest() {
            while (!FLAG) {  //如果false 一直等待
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }  
            return realData.getRequest();
        }
        
         
           
    }
    package FutureTest;
    
    public class FutureClient {
       //用户请求时候就会调用这个方法
        public Data request(String requestData){
        FutureData futureData = new FutureData();
              //开启一个线程
            new Thread(new Runnable() {
                public void run() {
                //会有阻塞  但是不影响到主线程
                RealData realData= new RealData("toov5"); //执行业务逻辑 然后返回结果
                futureData.setRealData(realData);  //把加载到的值(返回结果)设置给他
                
                }
            }).start(); 
              
            return futureData;  
        }
        
        
        
    }

    启动类主函数:

    package FutureTest;
    
    public class Main {
       public static void main(String[] args) {
          FutureClient futureClient = new FutureClient();
          Data request = futureClient.request("cone on");
          System.out.println("数据发送成功");  //主线程
          System.out.println("主线程继续干自己的");
          String result = request.getRequest();
          System.out.println("主线程去获取结果"+result);
    } 
    }

    结果:

     大家对应着上一篇博客好好研究下,这个模式的应用场景还是蛮多的。代码挺有趣的。

    当要获取资源的时候,data.getResult() ,如果资源没有准备好false;那么就会阻塞该线程。直到资源获取然后该线程被唤醒。

  • 相关阅读:
    C++ string 实现大整数相加减
    HDU2489 Minimal Ratio Tree 【DFS】+【最小生成树Prim】
    Quick-Cocos2d3.2RC1在Code IDE中实现代码提示
    Codeforces 558C Amr and Chemistry
    Linux编程---进程通信
    HDU 5371 Hotaru's problem(Manacher算法+贪心)
    微社区
    创业忌讳
    微信公众平台开发(82) 天气预报
    天气预报接口
  • 原文地址:https://www.cnblogs.com/toov5/p/9856153.html
Copyright © 2011-2022 走看看