最近因為開發專案的原因,接觸了許多 Java 1.8 之後才有的強大功能,其中一個就是 CompletableFuture。

CompletableFuture 其實跟 JavaScript 的 Promise 非常相似,僅需將特定的物件塞到 async function 中即可。

若是原先的作法,則需要另外撰寫 Listener 或是 callback,若需要一步步的執行這些非同步的功能,則需要將每一個步驟的下一步寫在 callback 當中,造成 Java 版的 Callback hell。

如果是透過 CompletableFuture 的話,僅需要多建立一個物件即可。

範例如下:

假設我們有一個 Service 名為 FooService,他的功能是以非同步的方式計算兩個數字的總和。

 

簡單解釋一下,FooService 透過一個 ScheduledExecutorService 建立 Thread Pool,並將計算的 Task 放入一個 Queue 當中,每隔一秒鐘會計算一次,開始時會先等待五秒鐘。

當計算好之後會將計算結果丟到 Callback 當中。

如果我們直接在 Main Thread 上執行的話,會因為 Main Thread 的結束導致其他 Thread 很快就結束,而原本沒做完的事情也不會做完。

另外,我們沒有辦法直接取得 Callback(lambda) 當中的內容,但是如果使用 CompletableFuture 的話則可以拿到。

Main 程式的寫法如下:

當然,Async 呼叫的地方也可以改成這種寫法比較簡易

 

實際執行起來會像這樣:

tty

 

其實 CompletableFuture 可以做的不只是這樣,他也可以讓多個 Task 同時執行,然後再匯聚,也可以像是 JavaScript Promise 使用大量的 “then” 或是 “thenAsync”。

Share Your Thought