JDK 8 中 CompletableFuture 是對 Future 的增強 大大簡化了異步編程步驟,在Spring 框架中配合@EnableAsync @Async 更加事辦功倍。
1:在JDK 8 之前實現多線必需實現兩個接口 Runnable 不帶返回值,另一個Callable帶返回值的接口,配合ThreadPoolTaskExecutor.submit(Callable callable) 返回一個Future對象。 使用Future獲得異步執行結果時,要么調用阻塞方法get(),要么輪詢看isDone()是否為true,這兩種方法都不是很好,因為主線程也會被迫等待,而CompletableFuture出現改變了這個問題,而且提供更多并且強大的其它功能。
2:CompletableFuture簡介 CompletableFuture<T> implements Future<T>, CompletionStage<T> 其實CompletableFuture 除了實現原來的Future 接口外,其它大部分方法都是在CompletionStage中
大致介紹下completableFuture的命名規則:
1:按功能分類的話:
xxx()
:表示該方法將繼續在已有的線程中執行;xxxAsync()
:表示將異步在線程池中執行。- 異步執行方法默認一個參數的話任務是在
ForkJoinPool.commonPool()
線程池中執行的,帶executor 參數的使用 executor線程池異步執行。
2:按邏輯和組織方式來分話(completableFuture 中大約有50個來方法)
- 一種是 then 的邏輯,即前一個計算完成的時候調度后一個計算
- 一種是 both 的邏輯,即等待兩個計算都完成之后執行下一個計算,只要能組合一個和另一個,我們就可以無限復用這個 +1 的邏輯組合任意多的計算
- 另一種是 either 的邏輯,即等待兩個計算的其中一個完成之后執行下一個計算。注意這樣的計算可以說是非確定性的。因為被組合的兩個計算中先觸發下一個計算執行的那個會被作為前一個計算,而這兩個前置的計算到底哪一個先完成是不可預知的
3:從依賴關系和出入參數類型區別,基本分為三類:
- apply 字樣的方式意味著組合方式是
Function
,即接受前一個計算的結果,應用函數之后返回一個新的結果 - accept 字樣的方式意味著組合方式是
Consumer
,即接受前一個計算的結果,執行消費后不返回有意義的值 - run 字樣的方式意味著組合方式是
Runnable
,即忽略前一個計算的結果,僅等待它完成后執行動作
http://www.aygfsteel.com/zzzlyr/articles/435611.html
4:completableFuture 配合框架使用
因為自從JDK8以后增強了多線程的使用便捷程度:http://www.aygfsteel.com/zzzlyr/articles/435305.html
1:JDk8 的函數式接口和lambda表過式
2:completableFuture 對 Future 類的增強。
這只是JDK 基礎包中的功能,現在大部分開發都在使用框架 java 現在基本上都在使用spring框架,因為JDK基礎包中的功能還是不如框架使用方便,下邊文章詳細介紹 springboot中對JDK基礎包中多線程功能配置和使用。