15 Future模式

6.2 Future模式

Future模式:頁面是異步的進行後臺處理,用戶無需一直等待請求的結果,可以繼續瀏覽或者操作其他內容。

 

 

代碼模擬Future模式:

/**

 * 主函數,先發送請求,啓動一個線程去執行查詢

 * 當前線程繼續併發執行

 */

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);

}

}

/**

 * 接受請求的時候啓動一個線程併發執行獲取結果

 * @author Vision_TXG

 *

 */

public class FutureClient {

 

public Data request(final String queryStr) {

final FutureData futureData = new FutureData();

new Thread(new Runnable() {

 

@Override

public void run() {

// TODO Auto-generated method stub

RealData realData = new RealData(queryStr);

futureData.setRealData(realData);

}

}).start();

//先返回一箇中間存放結果類的對象

return futureData;

}

}

 

/**

 * data接口

 * @author Vision_TXG

 *

 */

public interface Data {

public String getRequest();

}

 

/**

 * 中間保存結果類,防止髒讀(因爲是不同的線程在執行get和set),對其加鎖

 * @author Vision_TXG

 *

 */

public class FutureData implements Data{

 

private RealData realData;

private boolean isReady = false;

public synchronized void setRealData(RealData realData) {

if(isReady) {

return ;

}

this.realData = realData;

isReady = true;

notify();

}

@Override

public synchronized String getRequest() {

// TODO Auto-generated method stub

while(!isReady) {

try {

wait();

}catch(Exception e) {

e.printStackTrace();

}

}

return this.realData.getRequest();

}

 

}

 

 

/**

 * 獲取真正數據的類,獲取後放到中間結果類中

 * @author Vision_TXG

 *

 */

public class RealData implements Data {

 

private String result;

public RealData(String queryStr) {

System.out.println("根據" + queryStr + "進行查詢,這是一個很耗時得到操作...");

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("操作完畢,獲取結果");

result = "查詢結果";

}

@Override

public String getRequest() {

// TODO Auto-generated method stub

return result;

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章