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 }