posts - 22, comments - 32, trackbacks - 0, articles - 73
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          JDK 8 CompletableFuture 詳細使用介紹

          Posted on 2020-07-23 19:29 為自己代言 閱讀(866) 評論(0)  編輯  收藏 所屬分類: java/J2EE

          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 類圖
          大致介紹下completableFuture的命名規則

          1:按功能分類的話:

          • xxx():表示該方法將繼續在已有的線程中執行;

          • xxxAsync():表示將異步在線程池中執行。

          • 異步執行方法默認一個參數的話任務是在 ForkJoinPool.commonPool() 線程池中執行的,帶executor 參數的使用 executor線程池異步執行。

          2:按邏輯和組織方式來分話(completableFuture 中大約有50個來方法)

          • 一種是 then 的邏輯,即前一個計算完成的時候調度后一個計算

          • 一種是 both 的邏輯,即等待兩個計算都完成之后執行下一個計算,只要能組合一個和另一個,我們就可以無限復用這個 +1 的邏輯組合任意多的計算

          • 另一種是 either 的邏輯,即等待兩個計算的其中一個完成之后執行下一個計算。注意這樣的計算可以說是非確定性的。因為被組合的兩個計算中先觸發下一個計算執行的那個會被作為前一個計算,而這兩個前置的計算到底哪一個先完成是不可預知的

          3:從依賴關系和出入參數類型區別,基本分為三類:

          • apply 字樣的方式意味著組合方式是 Function,即接受前一個計算的結果,應用函數之后返回一個新的結果

          • accept 字樣的方式意味著組合方式是 Consumer,即接受前一個計算的結果,執行消費后不返回有意義的值

          • run 字樣的方式意味著組合方式是 Runnable,即忽略前一個計算的結果,僅等待它完成后執行動作
          其中出入參數主要有JDK8 Function,Consumer或Runnable三中函數型接口,每一種都決定了是怎么樣一種依賴關系,我有一篇文章詳細介紹了JDK8函數型接口用法,能有助理解completableFuture方法使用。
          http://www.aygfsteel.com/zzzlyr/articles/435611.html

          4:completableFuture 配合框架使用

            因為自從JDK8以后增強了多線程的使用便捷程度:
          1:JDk8 的函數式接口和lambda表過式
          2:completableFuture 對 Future 類的增強。
          這只是JDK 基礎包中的功能,現在大部分開發都在使用框架 java 現在基本上都在使用spring框架,因為JDK基礎包中的功能還是不如框架使用方便,下邊文章詳細介紹 springboot中對JDK基礎包中多線程功能配置和使用。
          http://www.aygfsteel.com/zzzlyr/articles/435305.html



          主站蜘蛛池模板: 松溪县| 揭阳市| 长兴县| 凤山县| 招远市| 中卫市| 镇平县| 淳化县| 历史| 黄山市| 永福县| 怀安县| 灌云县| 全州县| 射洪县| 九龙坡区| 斗六市| 达尔| 松桃| 江口县| 桂阳县| 六安市| 神池县| 湟中县| 鲁山县| 上高县| 峨边| 泰和县| 任丘市| 河池市| 拜泉县| 溆浦县| 疏附县| 逊克县| 德庆县| 宾川县| 尚志市| 扬中市| 丹阳市| 青岛市| 扶余县|