springboot CompletableFuture并行計算及使用方法
在Spring中,CompletableFuture通常用于異步編程,可以方便地處理異步任務(wù)的執(zhí)行和結(jié)果處理,CompletableFuture
是 Java 8 引入的一個類,用于支持異步編程和并發(fā)操作。它基于 Future 和 CompletionStage 接口,提供了豐富的方法來處理異步任務(wù)的執(zhí)行和結(jié)果處理。
下面是 CompletableFuture
實現(xiàn)的一些關(guān)鍵原理:
線程池支持:
CompletableFuture
內(nèi)部使用線程池來執(zhí)行異步任務(wù),可以通過指定不同的線程池來控制任務(wù)的執(zhí)行方式。默認(rèn)情況下,CompletableFuture
使用ForkJoinPool.commonPool()
作為默認(rèn)的線程池。回調(diào)函數(shù):
CompletableFuture
支持鏈?zhǔn)秸{(diào)用,可以通過thenApply()
,thenAccept()
,thenRun()
,thenCompose()
等方法添加回調(diào)函數(shù),在異步任務(wù)完成后處理任務(wù)的結(jié)果或執(zhí)行下一步操作。異常處理:
CompletableFuture
提供了exceptionally()
,handle()
,whenComplete()
等方法來處理異步任務(wù)中可能拋出的異常,確保異常能夠被捕獲并處理。組合操作:
CompletableFuture
支持多個 CompletableFuture 對象之間的組合操作,如thenCombine()
,thenCompose()
,allOf()
,anyOf()
等方法,實現(xiàn)并行執(zhí)行、串行執(zhí)行、等待所有任務(wù)完成等功能。CompletableFuture 工廠方法:除了
supplyAsync()
方法外,CompletableFuture
還提供了一系列工廠方法來創(chuàng)建 CompletableFuture 對象,如runAsync()
,completedFuture()
,failedFuture()
等,方便快速創(chuàng)建并管理異步任務(wù)。
總的來說,CompletableFuture
的實現(xiàn)基于 Future 和 CompletionStage 接口,利用線程池、回調(diào)函數(shù)、異常處理、組合操作等機(jī)制,提供了強(qiáng)大而靈活的異步編程功能,使得開發(fā)人員能夠更加方便地處理異步任務(wù)的執(zhí)行和結(jié)果處理。
使用方法(一)鏈?zhǔn)?/h2>
如果我們的業(yè)務(wù)方法已經(jīng)寫完了,這時可以直接通過supplyAsync方法來調(diào)用這些已知的方法,而不需要重新開發(fā)
CompletableFuture<String> a1 = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } return "Hello World"; }); CompletableFuture<String> a2 = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(2000); } catch (InterruptedException e) { throw new RuntimeException(e); } return "Hello World"; }); CompletableFuture<String> a3 = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(3000); } catch (InterruptedException e) { throw new RuntimeException(e); } return "Hello World"; }); // 這塊最后是并行計算時間為3秒 CompletableFuture.allOf(a1, a2, a3).join(); String result = a1.get() + " | " + a2.get() + " | " + a3.get();
使用方法(二)獨立方法
如果方法比較獨立,并且之前沒有開發(fā)過,那么你可以通過異步方法來將這些邏輯與調(diào)用代碼解耦
@Service @EnableAsync public class ParallelTaskService { @Async public CompletableFuture<String> task1() { // 模擬一個耗時操作 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } return CompletableFuture.completedFuture("Task 1 completed"); } @Async public CompletableFuture<String> task2() { // 模擬另一個耗時操作 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return CompletableFuture.completedFuture("Task 2 completed"); } } // 并行計算時,響應(yīng)時間是2和3秒之中最大值,即3秒 @GetMapping("/hello-world2") public CompletableFuture<String> helloWorld2() { CompletableFuture<String> task1Result = parallelTaskService.task1(); CompletableFuture<String> task2Result = parallelTaskService.task2(); // 等待所有任務(wù)都完成 CompletableFuture<Void> allOf = CompletableFuture.allOf(task1Result, task2Result); // 處理所有任務(wù)完成后的邏輯 return allOf.thenApply(voidResult -> { String result = task1Result.join() + " | " + task2Result.join(); return result; }); }
到此這篇關(guān)于springboot CompletableFuture并行計算的文章就介紹到這了,更多相關(guān)springboot 并行計算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis接口Mapper內(nèi)的方法為啥不能重載嗎
這篇文章主要介紹了Mybatis接口Mapper內(nèi)的方法為啥不能重載嗎,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09java SelectableChannel的使實例用法講解
在本篇文章里小編給大家整理的是一篇關(guān)于java SelectableChannel的使實例用法講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-03-03Kotlin中l(wèi)et、run、with、apply及also的用法和差別
作用域函數(shù)是Kotlin比較重要的一個特性,分為5種let、run、with、apply及also,這五個函數(shù)的工作方式非常相似,但是我們需要了解這5種函數(shù)的差異,以便在不同的場景更好的利用它,這篇文章主要介紹了Kotlin中l(wèi)et、run、with、apply及also的差別,需要的朋友可以參考下2023-11-11Spring?Boot?整合?FreeMarker?實例分享
這篇文章主要分享了Spring?Boot整合FreeMarker?實例FreeMarker是一款模板引擎,即一種基于模板和要改變的數(shù)據(jù),并用來生成輸出文本,更多相關(guān)介紹需要的小伙伴可以參考下面文章內(nèi)容2022-05-05springboot實戰(zhàn)權(quán)限管理功能圖文步驟附含源碼
這篇文章主要為大家介紹了springboot實戰(zhàn)權(quán)限管理功能圖文步驟及示例源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Java?Spring?boot?配置JDK和MAVEN開發(fā)環(huán)境的過程
本文詳細(xì)介紹了如何配置JDK和Maven環(huán)境,包括JDK的安裝與環(huán)境變量設(shè)置,Maven的下載、配置環(huán)境變量和設(shè)置阿里云倉庫,最后簡述了在IntelliJ?IDEA中配置JDK和Maven的步驟,本教程適合Java開發(fā)新手進(jìn)行開發(fā)環(huán)境的搭建,確保順利進(jìn)行Java項目的開發(fā)2024-11-11