zoukankan      html  css  js  c++  java
  • Future初次使用理解

                 当客户端执行方法时,立即返回一个代理对象,此时代理对象没有数据,与此同时开启一个线程去构造真实对象并把真实对象替换掉代理对象(使用set方法)。所以就会出现,客户端收到代理对象之后以为执行完了然后执行下一步,当需要调用这个代理对象的方法时,方法中返回的是构造完毕的真实对象的数据;

        利用其他方法的执行时间异步将真实对象构建出来。提高效率。

        在代理对象中的set方法中标记真实对象的构建状态,如果没有调用set方法构建状态默认为false,调用代理对象getresult方法时就无限等待。挡调用set方法时,标记代理对象构建成功,调用notifyAll唤醒等待,这样getResult方法即可返回真是对象数据。

    代码摘自 https://blog.csdn.net/lmdcszh/article/details/39696357

    (1)Main函数:

     

    [java] view plain copy
     
    1. <span style="font-size:18px;">package tgb;  
    2.   
    3. public class Main {  
    4.       
    5.     public static void main(String[] args){  
    6.         Client client = new Client();  
    7.         //理解返回一个FutureData  
    8.         Data data = client.request("name");  
    9.         System.out.println("请求完毕!");  
    10.           
    11.         try{  
    12.               
    13.             //处理其他业务  
    14.             //这个过程中,真是数据RealData组装完成,重复利用等待时间  
    15.             Thread.sleep(2000);           
    16.               
    17.         }catch (Exception e){  
    18.               
    19.         }  
    20.           
    21.         //真实数据  
    22.         System.out.println("数据 = "+ data.getResult());  
    23.           
    24.           
    25.     }  
    26.       
    27. }  
    28. </span>  

    (2)Client的实现:

     

    [java] view plain copy
     
    1. <span style="font-size:18px;">package tgb;  
    2.   
    3. public class Client {  
    4.   
    5.     public Data request(final String queryStr){  
    6.         final FutureData future = new FutureData();  
    7.         //开启一个新的线程来构造真实数据  
    8.         new Thread(){  
    9.             public void run(){  
    10.                 RealData realData = new RealData(queryStr);  
    11.                 future.setRealData(realData);           }  
    12.         }.start();  
    13.         return future;  
    14.     }  
    15. }  
    16. </span>  


    (3)Data的实现:

     

    [java] view plain copy
     
    1. <span style="font-size:18px;">package tgb;  
    2.   
    3. public interface Data {  
    4.   
    5.     public  String getResult();  
    6. }  
    7. </span>  


    (4)FutureData:

     

    [java] view plain copy
     
    1. <span style="font-size:18px;">package tgb;  
    2.   
    3. /** 
    4.  * 是对RealData的一个包装 
    5.  * @author limin 
    6.  * 
    7.  */  
    8. public class FutureData implements Data {  
    9.   
    10.     protected RealData realData =null;  
    11.     protected boolean isReady = false;  
    12.     public synchronized void setRealData(RealData realData){  
    13.         if(isReady){  
    14.             return;  
    15.         }  
    16.         this.realData=realData;  
    17.         isReady=true;  
    18.         notifyAll();  
    19.           
    20.     }  
    21.       
    22.     @Override  
    23.     public  synchronized  String getResult() {  
    24.         while(!isReady){  
    25.             try{  
    26.                 wait();  
    27.             }catch (Exception e){  
    28.                   
    29.             }  
    30.         }  
    31.         return realData.result;  
    32.     }  
    33.   
    34. }  
    35. </span>  


    (5)RealData实现:

     

    [java] view plain copy
     
      1. <span style="font-size:18px;">package tgb;  
      2.   
      3. public class RealData implements Data {  
      4.     protected  String  result;  
      5.       
      6.     public RealData(String para){  
      7.          //构造比较慢  
      8.         StringBuffer sb= new StringBuffer();  
      9.         for(int i=0;i<10;i++){  
      10.             sb.append(para);  
      11.             try{  
      12.                 Thread.sleep(1000);  
      13.             }catch(Exception e){  
      14.                   
      15.             }  
      16.             result= sb.toString();  
      17.         }  
      18.     }  
      19.       
      20.       
      21.       
      22.     @Override  
      23.     public String getResult() {  
      24.   
      25.         return result;  
      26.     }  
      27.   
      28. }  
      29. </span>  
  • 相关阅读:
    Python:FriendFeed的Tornado Web Server
    用psake来简化自动化脚本的构建
    Eucalyptus企业云计算
    兰州大学百年校庆风雨百年萃英路
    JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法
    Winform开发框架之权限管理系统
    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(2)常用操作
    Socket开发框架之数据采集客户端
    Winform开发框架之终极应用
    Winform分页控件使用详细介绍
  • 原文地址:https://www.cnblogs.com/CHWLearningNotes/p/9084282.html
Copyright © 2011-2022 走看看