一、Future模式的使用。
Future模式簡述
傳統單線程環境下,調用函數是同步的,必須等待程序返回結果后,才可進行其他處理。 Futrue模式下,調用方式改為異步。
Futrue模式的核心在於:充分利用主函數中的等待時間,利用等待時間處理其他任務,充分利用計算機資源。
主要角色
Main:系統啟動,調用Client發出請求
Client:返回Data對象,立即返回FutureData,並開啟ClientThread線程裝配
RealData Data:返回數據的接口
FutureData:Futrue數據,是一個虛擬的數據,需要裝配RealData RealData:真實數據,構造比較慢
二、實現代碼
Main類
public class Main { public static void main(String[] args) { FutureClient fc = new FutureClient(); Data data = fc.request("請求參數"); System.out.println("請求參數發送成功"); System.out.println("開始做其他事情"); String result = data.getRequest(); System.out.println(result); } }
FutureCliet類
public Data request(final String queryStr) { // 1 我想要一個代理對象(Data接口的實現類)先返回給發送請求的客戶端, // 告訴他的請求已經收到,可以干其他事情 final FutureData futureData = new FutureData(); // 2.創建一個新的線程,去加載真是數據,傳遞個這個代理對象 new Thread(new Runnable() { @Override public void run() { // 3.這個新的線程可以慢慢去加載真是對象,然后傳遞給代理對象 RealData realData = new RealData(queryStr); futureData.setRealData(realData); } }).start(); return futureData; }
Data接口
public interface Data { String getRequest(); }
FutureData
public class FutureData implements Data { private RealData realData; private boolean isReady = false; @Override public synchronized String getRequest() { // 如果沒有裝載好久一直處於阻塞狀態 while (!isReady) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 裝載好可以直接獲取數據 return this.realData.getRequest(); } public synchronized void setRealData(RealData realData) { if (isReady) { return; } this.realData = realData; isReady = true; notify(); } }
RealData
public class RealData implements Data { private String result; public RealData() { } public RealData(String queryStr) { System.out.println("根據" + queryStr + "進行查詢" + "這是一個很耗時間的操作..."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("操作完畢"); result = "查詢結果"; } @Override public String getRequest() { return result; } }