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