Future --- 多執行緒設計模式
Future --- 多執行緒設計模式
說到多執行緒的future,百度 多執行緒 future,網上也有各式各樣的例子,寫的比我還要好,但是實在是這個模式或者說例子以及實用性太大了,我不得不拿出來講,甚至在實際生產環境中也是可以用的.我呢,也是拿出網上的例子詳細的講一遍~~
看下面的圖↓↓↓↓↓
如上圖,傳統的訂單下單流程,首先減商品庫存,然後生成訂單,然後生成訂單詳情,再通知簡訊等等,全部邏輯程式都是序列執行的.假如我們的系統特別'困難',減商品庫存要1秒,生成訂單要1秒,生成詳情也要1秒,傳送簡訊有可能要5秒,這裡還不算查詢商品的庫存夠不夠下單等等,那麼一系列的操作就要花很多時間.
那麼引入多執行緒的future有什麼好處呢?看下圖↓↓↓↓↓↓↓
看這圖很簡單,使用者下單,future物件直接告訴你下單成功,返回給你一個假資料,同時自己偷偷的新建了一個或者幾個執行緒處理其他業務邏輯,等邏輯處理完了,再返回一個正確的結果.
然後是上程式碼~~
public interface Data {
String getRequest();
}
public class RealData implements Data {
private String result;
public RealData(String request) {
System.out.println("根據" + request + "進行查詢..,要花很久時間");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("操作完畢,獲取結果");
result = "查詢結果";
}
public String getRequest() {
return result;
}
}
public class FutureData implements Data {
private RealData realData;
private boolean isReady = false;
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();
}
}
public class FutureClient {
public Data request(final String request) {
final FutureData futureData = new FutureData();
new Thread(new Runnable() {
public void run() {
RealData realData = new RealData(request);
futureData.setRealData(realData);
}
}).start();
return futureData;
}
}
public class Main {
public static void main(String[] args) {
FutureClient fClient = new FutureClient();
Data data = fClient.request("hello,world");
System.out.println("請求傳送成功...");
System.out.println("幹其他的事情...");
String result = data.getRequest();
System.out.println(result);
}
}
一共5個類,剛開始看會有點懵逼,正常,我也是懵逼的,我到現在也還是懂了90%,為什麼懂90%就敢講,其實也差不多了~自己按照程式碼一個單詞一個單詞的教,自然就懂思想.就按照我貼的程式碼順序我們一點一點看,這個模式很有意思的,真的能學到很多東西.
首先看這個介面Data,只有一個方法getRequest(),返回String字串.
然後再看RealData這個類,實現了Data介面,首先他有建構函式,列印了兩句話,然後中間sleep一下,做這個sleep我們可以想象成在處理業務邏輯.
接著再看FutureData這個類,也實現了Data介面.先看FutureData的getRequest()方法,這個方法先死迴圈判斷boolean,如果isReady是true,就阻塞著,不然就返回RealData真的getRequest()方法(真實的結果).然後再看setRealData(),判斷isReady,如果是ture,直接return,如果不是就賦值RealData,並修改isReady,然後notify()..
其實很好理解,不要看到synchronized,notify,wait就暈了,FutureData這個類幹了啥,你想,wait什麼?不就是等notify嗎,如果沒有notify,那我就得等著,等什麼?還是等通知啊,只有通知了,那麼我才能進行下去,進行下去什麼?--->RealData.getRequset()啊,就是真實的資料,為什麼要等?因為還在處理啊,只有真實的資料處理完了,然後通知,也就是說FutureData這個類的setRealData()只是起到通知的作用,再看setRealData()傳入的是RealData物件,RealData幹了啥事,不就是有個建構函式實現自己的業務嗎,實現完了就可以通知!!還不懂,自己敲程式碼..結合我說的多讀幾遍,別被饒暈了~~~
最後看FutureClient 這個類,最簡單了,返回futureData,偷偷開了執行緒,看到RealData realData = new RealData(request)沒有?就是開始執行業務了,然後當FutureData這個類的setRealData(RealData realData)時就通知了..我現在都100%懂了~~~
最後Main方法就不說了~
列印結果↓↓↓↓↓↓
請求傳送成功...
幹其他的事情...
根據hello,world進行查詢..,要花很久時間
操作完畢,獲取結果
查詢結果
第四句話和第五話是2秒後才出來的~~~~
上面的原理你可以不用懂,當然懂最好了,可以在面試官面前吹牛逼啊..future模式這麼凶殘,jdk也有實現的,在java.util.concurrent,又是concurrent,這個工具類真的是強大~上程式碼,就不說了~~
import java.util.concurrent.Callable;
public class RealData implements Callable<String> {
private String Data;
public RealData(String Data) {
this.Data = Data;
}
public String call() throws Exception {
//利用sleep來表示任務處理
Thread.sleep(2000);
return "這是處理"+Data+"結果";
}
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class Main {
public static void main(String[] args) throws Exception {
Long start = System.currentTimeMillis();
FutureTask<String> futureTask = new FutureTask<>(new RealData("hello,world"));
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(1);
newFixedThreadPool.submit(futureTask);
// 表示正在處理其他邏輯,或者業務
Thread.sleep(1000);
System.out.println("最後結果-->" + futureTask.get());
Long end = System.currentTimeMillis();
Long useTime = end - start;
System.out.println("程式執行了-->" + useTime + "毫秒");
}
}
最後奉上列印結果↓↓↓↓↓
最後結果-->這是處理hello,world結果
程式執行了-->2004毫秒
看2秒就執行完了..最好自己敲一遍~
相關文章
- 多執行緒設計模式之Worker Thread模式執行緒設計模式thread
- Java多執行緒-Callable和FutureJava執行緒
- java多執行緒程式設計,Thread,Runnable,Future相關知識Java執行緒程式設計thread
- Java多執行緒之Callable,Future,FutureTaskJava執行緒
- 多執行緒系列(十九) -Future使用詳解執行緒
- Java 多執行緒設計模式之 Single Threades ExecutionJava執行緒設計模式thread
- Java 多執行緒設計模式之基礎概念Java執行緒設計模式
- 多執行緒07:async、future、packaged_task、promise執行緒PackagePromise
- ros 多執行緒模式ROS執行緒模式
- 多執行緒Reactor模式執行緒React模式
- python 多執行緒程式設計Python執行緒程式設計
- JavaScript多執行緒程式設計JavaScript執行緒程式設計
- Python多執行緒程式設計Python執行緒程式設計
- 多執行緒設計模式-高併發請求快取模式(Guarded Suspension)執行緒設計模式快取
- Java多執行緒程式設計筆記10:單例模式Java執行緒程式設計筆記單例模式
- 大話Android多執行緒(四) Callable、Future和FutureTaskAndroid執行緒
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- 多執行緒程式設計總結:一、認識多執行緒本質執行緒程式設計
- 多執行緒程式設計ExecutorService用法執行緒程式設計
- 29. 多執行緒程式設計執行緒程式設計
- C#多執行緒程式設計實戰1.1建立執行緒C#執行緒程式設計
- 多執行緒程式設計基礎(二)-- 執行緒池的使用執行緒程式設計
- C#多執行緒程式設計-基元執行緒同步構造C#執行緒程式設計
- 深入理解多執行緒程式設計執行緒程式設計
- [02] 多執行緒邏輯程式設計執行緒程式設計
- Linux C++ 多執行緒程式設計LinuxC++執行緒程式設計
- iOS開發-多執行緒程式設計iOS執行緒程式設計
- Task+ConcurrentQueue多執行緒程式設計執行緒程式設計
- 實驗六 Java多執行緒設計Java執行緒
- 深入淺出Win32多執行緒程式設計--之MFC的多執行緒Win32執行緒程式設計
- 多執行緒和多執行緒同步執行緒
- 【多執行緒高併發程式設計】二 實現多執行緒的幾種方式執行緒程式設計
- 多執行緒,到底該設定多少個執行緒?執行緒
- java多執行緒程式設計:你真的瞭解執行緒中斷嗎?Java執行緒程式設計
- Java多執行緒程式設計—鎖優化Java執行緒程式設計優化
- 多執行緒程式設計相關理論執行緒程式設計
- 多執行緒併發程式設計“鎖”事執行緒程式設計
- 使用Java實現多執行緒程式設計Java執行緒程式設計