1. 程式人生 > >九 fork/join CompletableFuture

九 fork/join CompletableFuture

問題 str 們的 分離 gpo don 場景 回調方法 ble

1: Fork/join

fork/join: fork是分叉的意思, join是合並的意思。

Fork/Join框架:是JAVA7提供的一個用於並行執行任務的框架,是一個把大任務分割成若幹個小任務,最終匯總每個小任務結果後得到大任務結果的框架。

Fokr/Join的適合場景:所處理的元素必須是獨立的,數據集要足夠大;

並且在並行加速方面,每個元素的處理成本要足夠高,這樣才能補償建立fork/join框架所消耗的成本。

這個文章中的例子(http://www.infoq.com/cn/articles/Functional-Style-Callbacks-Using-CompletableFuture)很好的說明了 Future, ExecutorCompletionService,

CompletableFuture處理一個圖片下載的例子時候的對比。

2: Future:

Future是Java 5添加的類,用來描述一個異步計算的結果,但是獲取一個結果時方法較少,要麽通過輪詢isDone,確認完成後,調用get()獲取值;

要麽調用get()設置一個超時時間。但是這個get()方法會阻塞住調用線程,這種阻塞的方式顯然和我們的異步編程的初衷相違背;

Future本身並不能提供回調方法. 任務提交到executor,通過Future.isDone和阻塞的Future.get()來看結果是否完成。

3: ExecutorCompletionService

把多個FutureTask提交到ExecutorCompletionService,task執行完的結果放到queue中,ExecutorCompletionService.get() 或者,poll()會從隊列中依次取得

執行完的task, 再進行下一步處理。(這個方法比上面的方法好,上面只能是按照提交的順序依次判斷結果是否完成)

3: CompletableFuture

它能夠將回調放到與任務不同的線程中執行(thenApplyAsync),也能將回調作為繼續執行的同步函數(thenApply),在與任務相同的線程中執行。

它避免了傳統回調最大的問題,那就是能夠將控制流分離到不同的事件處理器中

(thenApplyAsync()可以異步的在不同的線程中處理上一步結果)

4: CompletableFutre詳解

待續... ...

https://www.cnblogs.com/tian666/p/7840232.html

九 fork/join CompletableFuture