Feature初次使用理解

             当客户端执行方法时,立即返回一个代理对象,此时代理对象没有数据,与此同时开启一个线程去构造真实对象并把真实对象替换掉代理对象(使用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>  

猜你喜欢

转载自www.cnblogs.com/CHWLearningNotes/p/9084282.html