Future模式介紹及入門使用


 

FutureClient代碼實現:

 1 package com.hjf.future;
 2 
 3 public class FutureClient
 4 {
 5     /**
 6      * 請求客戶端
 7      * @param queryStr
 8      * @return
 9      */
10     public Data request(final String queryStr){
11         //1:創建一個代理對象(Data接口的實現類)先返回給發送請求的客戶端,告訴他請求已經接收到,可以做其他的事情
12         final FutureData fd = new FutureData();
13         //2:啟動一個新的線程,去加載真實的數據,傳遞給這個代理對象
14         new Thread(new Runnable()
15         {
16             @Override
17             public void run()
18             {
19                 //3:這個新的線程可以去后台加載真實的數據
20                 RealDate rd = new RealDate(queryStr);
21                 //4:傳遞給代理對象
22                 fd.setRealData(rd);
23             }
24         }).start();
25         //5:返回代理對象
26         return fd;
27     }
28 }

 

FutureData代碼及實現:

 1 package com.hjf.future;
 2 
 3 public class FutureData implements Data
 4 {
 5     /*真實數據*/
 6     private RealDate realData;
 7     
 8     /*是否加載完成的控制器*/
 9     private boolean isready = false;
10     
11     /**
12      * 裝載真實的數據
13      * @param realData
14      */
15     public synchronized void setRealData(RealDate realData)
16     {
17         //realData已經裝載到FutureData中了,直接返回
18         if(isready){
19             return;
20         }
21         this.realData = realData;//裝載數據
22         isready = true;//修改控制器
23         notify();
24     }
25     
26     /**
27      * 獲取請求的最終結果
28      */
29     @Override
30     public synchronized String getRequest()
31     {
32         //未加載數據的情況下保持等待 等待狀態真實數據完成
33         while(!isready){
34             try
35             {
36                 wait();
37             } catch (InterruptedException e)
38             {
39                 e.printStackTrace();
40             }
41         }
42         //裝載完成時獲取數據即可
43         return this.realData.getRequest();
44     }
45 
46 }

 

RealData代碼及實現:

 1 package com.hjf.future;
 2 
 3 public class RealDate implements Data
 4 {
 5     /*查詢結果*/
 6     private String result;
 7 
 8     public RealDate(String queryStr){
 9         System.out.println("根據 "+queryStr+" 進行查詢,這是一個很耗時的操作..");
10         try
11         {
12             //模擬真實的情況
13             Thread.sleep(5000);
14         } catch (InterruptedException e)
15         {
16             e.printStackTrace();
17         }
18         System.out.println("操作完畢,獲取數據");
19         this.result = "查詢結果";
20     }
21     
22     /**
23      * 獲取真實的請求數據
24      * @return
25      */
26     @Override
27     public String getRequest()
28     {
29         return result;
30     }
31 }

 

Data接口代碼:

1 package com.hjf.future;
2 
3 public interface Data
4 {
5     String getRequest();
6 }

 

測試類代碼:

 1 package com.hjf.future;
 2 
 3 public class Main
 4 {
 5     public static void main(String[] args)
 6     {
 7         FutureClient  fc = new FutureClient();
 8         Data data  = fc.request("請求參數");
 9         System.out.println("請求發送成功");
10         
11         System.out.println("做其他的事情...");
12         
13         String result  = data.getRequest();
14         System.out.println(result); 
15     }
16 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM