Posted on 2020-07-23 19:29
為自己代言 閱讀(859)
評論(0) 編輯 收藏 所屬分類:
java/J2EE
JDK 8 中 CompletableFuture 是對 Future 的增強(qiáng) 大大簡化了異步編程步驟,在Spring 框架中配合@EnableAsync @Async 更加事辦功倍。
1:在JDK 8 之前實(shí)現(xiàn)多線必需實(shí)現(xiàn)兩個(gè)接口 Runnable 不帶返回值,另一個(gè)Callable帶返回值的接口,配合ThreadPoolTaskExecutor.submit(Callable callable) 返回一個(gè)Future對象。
使用Future獲得異步執(zhí)行結(jié)果時(shí),要么調(diào)用阻塞方法get(),要么輪詢看isDone()是否為true,這兩種方法都不是很好,因?yàn)橹骶€程也會被迫等待,而CompletableFuture出現(xiàn)改變了這個(gè)問題,而且提供更多并且強(qiáng)大的其它功能。
2:CompletableFuture簡介
CompletableFuture<T> implements Future<T>, CompletionStage<T>
其實(shí)CompletableFuture 除了實(shí)現(xiàn)原來的Future 接口外,其它大部分方法都是在CompletionStage中

大致介紹下completableFuture的命名規(guī)則:
1:按功能分類的話:
xxx()
:表示該方法將繼續(xù)在已有的線程中執(zhí)行;
xxxAsync()
:表示將異步在線程池中執(zhí)行。
- 異步執(zhí)行方法默認(rèn)一個(gè)參數(shù)的話任務(wù)是在
ForkJoinPool.commonPool()
線程池中執(zhí)行的,帶executor 參數(shù)的使用 executor線程池異步執(zhí)行。
2:按邏輯和組織方式來分話(completableFuture 中大約有50個(gè)來方法)
- 一種是 then 的邏輯,即前一個(gè)計(jì)算完成的時(shí)候調(diào)度后一個(gè)計(jì)算
- 一種是 both 的邏輯,即等待兩個(gè)計(jì)算都完成之后執(zhí)行下一個(gè)計(jì)算,只要能組合一個(gè)和另一個(gè),我們就可以無限復(fù)用這個(gè) +1 的邏輯組合任意多的計(jì)算
- 另一種是 either 的邏輯,即等待兩個(gè)計(jì)算的其中一個(gè)完成之后執(zhí)行下一個(gè)計(jì)算。注意這樣的計(jì)算可以說是非確定性的。因?yàn)楸唤M合的兩個(gè)計(jì)算中先觸發(fā)下一個(gè)計(jì)算執(zhí)行的那個(gè)會被作為前一個(gè)計(jì)算,而這兩個(gè)前置的計(jì)算到底哪一個(gè)先完成是不可預(yù)知的
3:從依賴關(guān)系和出入?yún)?shù)類型區(qū)別,基本分為三類:
- apply 字樣的方式意味著組合方式是
Function
,即接受前一個(gè)計(jì)算的結(jié)果,應(yīng)用函數(shù)之后返回一個(gè)新的結(jié)果
- accept 字樣的方式意味著組合方式是
Consumer
,即接受前一個(gè)計(jì)算的結(jié)果,執(zhí)行消費(fèi)后不返回有意義的值
- run 字樣的方式意味著組合方式是
Runnable
,即忽略前一個(gè)計(jì)算的結(jié)果,僅等待它完成后執(zhí)行動作
其中出入?yún)?shù)主要有JDK8 Function,Consumer或Runnable三中函數(shù)型接口,每一種都決定了是怎么樣一種依賴關(guān)系,我有一篇文章詳細(xì)介紹了JDK8函數(shù)型接口用法,能有助理解completableFuture方法使用。http://m.tkk7.com/zzzlyr/articles/435611.html4:completableFuture 配合框架使用
因?yàn)樽詮腏DK8以后增強(qiáng)了多線程的使用便捷程度:
1:JDk8 的函數(shù)式接口和lambda表過式
2:completableFuture 對 Future 類的增強(qiáng)。
這只是JDK 基礎(chǔ)包中的功能,現(xiàn)在大部分開發(fā)都在使用框架 java 現(xiàn)在基本上都在使用spring框架,因?yàn)镴DK基礎(chǔ)包中的功能還是不如框架使用方便,下邊文章詳細(xì)介紹 springboot中對JDK基礎(chǔ)包中多線程功能配置和使用。
http://m.tkk7.com/zzzlyr/articles/435305.html