Java異步線程中的CompletableFuture與@Async詳解
引言
1.CompletableFuture是java中提供的一個異步執(zhí)行類,@Async是Spring提供的異步執(zhí)行方法,當調用方法單獨開啟一個線程進行調用。
2.@Async通常指定一個方法使用的異步方法調用,而CompletableFuture可以一個方法體內(nèi)對請求體進行排序組合成鏈式調用再返回
1.@Async的使用
@Async的粒度比較大,在使用的時候只能添加到方法上,并且需要自定義線程池。
實現(xiàn):
需要在配置類上添加@Configuration
需要實現(xiàn)AsyncConfigure接口,里面有兩個方法可以重寫[getAsyncExecutor,getAsyncUncaughtExceptionHandler],主要實現(xiàn)的方法是getAsyncExecutor(),
我們當時實現(xiàn)手動注入一個@Bean。
ps:ThreadPoolTaskExecutor設計模式是:模板方法和策略模式
代碼實現(xiàn):
@Configuration
@EnableAsync
public class AsyncTaskConfig implements AsyncConfigurer {
@Override
@Bean
public Executor getAsyncExecutor() {
/**
* ThreadPoolExecutor通用線程池
* ThreadPoolTaskExecutor 是再ThradPoolExecutor上面做增強,支持業(yè)務執(zhí)行任務、支持定時任務、spring的線程管理等
*/
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(100);
threadPoolTaskExecutor.setQueueCapacity(10);
// 設置線程池全部結束的時候才完全關閉線程
threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
// 當線程關閉的時候需要等待多長時間才進行關閉
threadPoolTaskExecutor.setAwaitTerminationSeconds(60);
// 設置線程的名字
threadPoolTaskExecutor.setThreadNamePrefix("Rabbit-Async-");
// 進行初始化
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
// 需要實現(xiàn)AsynConfiguration的兩個方法
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}2.CompletableFuture總體架構

Future 它是java5添加的接口,用來描述一個異步計算的結果,可以用isDone方法來計算是否完成,或者使用get阻塞往效用線程,直到計算返回結果,可以使用Cancel方法停止任務執(zhí)行。
CompletableFuture實現(xiàn)Furure接口,不推薦使用get方式阻塞或者輪詢方式獲取結果。
CompletableFuture.supplyAsync(Runnable,Executor);//支持返回值
CompletableFutre.runAsync(Runnable,Executor);//不支持返回值
3.計算完成時回調方法
whenComplete(BigConsumer):同步完成正常處理結果
whenCompleteAsync(BigConsumer):異步完成處理結果
whenCompleteAysnc(BigConsumer,Executor):異步完成處理結果
exceptionally(Function):處理異常結果

串行化與并行化
串行化:程序從上到下執(zhí)行的都是一個循序
并行化:從上到下執(zhí)行順序不一定
串行化案例
thenApply方法(有返回值):當一個線程依賴另一個線程是,獲取上一個任務返回結果,并返回當前任務的返回值
thenAccept方法(無返回值):接受任務的處理結果,并消費處理,無返回值結果。
thenRun方法(最后執(zhí)行):只有上面的任務執(zhí)行完成,就開始執(zhí)行thenRun,只是處理完任務后執(zhí)行thenRun的后續(xù)操作。

并行化案例:

多任務組合
allof().join();:等待所有任務完成之后返回
anyof():只有一個任務完成
到此這篇關于Java異步線程中的CompletableFuture與@Async詳解的文章就介紹到這了,更多相關CompletableFuture與@Async內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java的Comparable,Comparator和Cloneable三大接口詳解
這篇文章主要為大家詳細介紹了Java的Comparable,Comparator和Cloneable的接口,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
通過簡單方法實現(xiàn)spring boot web項目
這篇文章主要介紹了通過簡單方法實現(xiàn)spring boot web項目,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09

