Future模式
相似於用戶提交商品訂單,下單成功之後後臺異步的執行耗時的業務
在java.util.concurrent包中.Future接口是Java線程Future模式的實現,能夠來進行異步計算。java
1.定義一個接口來處理請求異步
public interface Data{ String getRequest(); }
2.定義一個轉發請求的客戶端測試
public class FutureClient{ public Data request(final String queryStr){ //1.添加一個代理對象(Data接口的實現類) 先返回給發送請求的客戶端 //告訴客戶端收到請求,能夠處理其餘事情 final FutureData futureData = new FutureData(); //2.啓動一個新的線程 去加載真實的數據 傳遞給這個代理對象 new Thread(new Runnable(){ public void run(){ //3這個新的線程能夠去慢慢的加載真實對象 //而後傳遞給代理對象 RealData realData = new RealData(queryStr); futureData.setRealData(realData); } }).start(); return futureData; } }
3.定義一個代理類來返回數據this
public class FutureData implements Data{ private RealData realData; private boolean isReady = false; public void synchronized void setRealData(RealData realData){ //若是已經轉載完畢 直接返回 if(iReady){ return; } //若是沒有裝載,進行裝載真實對象 this.realData = realData; isReady = true; //進行通知 notify(); } public synchronized String getRequest(){ //若是沒有裝載好 程序就一直處於阻塞的狀態 while(!isReady){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //裝載好直接獲取數據便可 return this.realData.getRequest(); } }
4.定義一個處理大量耗時操做的類spa
public class RealData implements Data{ private String result; public RealData(String queryStr){ System.out.println("根據" + queryStr + "進行查詢, 這是一個很耗時的操做.."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("操做完畢,獲取結果"); result = "查詢結果"; } public String getRequest(){ retun result; } }
5.定義一個測試類線程
public class Main{ public static void main(String[] args) throws InterruptedException { FutureClient fc = new FutureClient(); Data data = fc.request("發送請求"); System.out.println("請求發送成功!"); System.out.println("作其餘的事情..."); String result = data.getRequest(); System.out.println(result); } }
結果以下代理