Future設計模式學習記錄備忘
Future模式設計圖
圖片摘自(https://www.cnblogs.com/jianzh5/p/6121120.html)
簡單實現代碼
- Data接口
package org.cc.future; public interface Data { public String getResult(); }
-
FutrueData類
package org.cc.future; public class FutureData implements Data { RealData data; boolean isRead=false; public synchronized void setRealData(RealData realData){ if(isRead) return; data=realData; //複製成功標記isRead=true;等於true 獲取值就不用等待 isRead=true; notify(); } @Override public synchronized String getResult() { if(!isRead){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } return data.getResult(); } }
-
RealData(真實數據處理類)
package org.cc.future; import java.util.Random; public class RealData implements Data { public RealData(String request){ try { Thread.sleep(1000*(new Random().nextInt(10))); } catch (InterruptedException e) { e.printStackTrace(); } result="返回:"+request; } private String result; @Override public String getResult() { return result; } }
-
FutureClient
package org.cc.future; public class FutureClient { public Data request(final String request){ FutureData data=new FutureData(); new Thread(()->{ RealData realData=new RealData(request); data.setRealData(realData); return; }).start(); return data; } public static void main(String[] args) { FutureClient fc=new FutureClient(); Data data= fc.request("測試"); System.out.println("做其他的相關業務操作!"); String result= data.getResult(); System.out.println(result); } }
Future模式總結
- 是一種異步執行。也是利用空間換時間的概念
- 適合互聯網高併發的環境
- Future模式在處理很消耗處理時間的業務時,可以有效 的減少相應時間
JDK java.util.concurrent.FutureTask類
JDK下面的java.util.concurrent.FutureTask已經幫我們實現此種模式
-
用法如下
package org.cc; import java.util.concurrent.*; public class UseFutureTask implements Callable<String> { public String request; public UseFutureTask(String request) { this.request = request; } @Override public String call() throws Exception { //休息10秒模擬任務處理時間 Thread.sleep(10000); return request+"以返回"; } public String getRequest() { return request; } public void setRequest(String request) { this.request = request; } public static void main(String[] args) throws ExecutionException, InterruptedException { long startTime = System.currentTimeMillis(); FutureTask<String> ft1=new FutureTask<String>(new UseFutureTask("測試數據一")); FutureTask<String> ft2=new FutureTask<String>(new UseFutureTask("測試數據二")); ExecutorService es= Executors.newFixedThreadPool(2); es.submit(ft1); es.submit(ft2); //休息5秒模擬處理其他任務 Thread.sleep(5000); // ft1.get()返回實際結果 System.out.println(ft1.get());//異步處理。最終返回結果小於(5000+10000)毫秒 System.out.println(ft2.get());//異步返回 long endTime = System.currentTimeMillis(); long time_consuming = endTime - startTime; System.out.println("實際處理時間:"+time_consuming); es.shutdown(); } }
-
執行結果
測試數據一以返回 測試數據二以返回 實際處理時間:10083