Java異步線程中的CompletableFuture與@Async詳解
引言
1.CompletableFuture是java中提供的一個(gè)異步執(zhí)行類,@Async是Spring提供的異步執(zhí)行方法,當(dāng)調(diào)用方法單獨(dú)開啟一個(gè)線程進(jìn)行調(diào)用。
2.@Async通常指定一個(gè)方法使用的異步方法調(diào)用,而CompletableFuture可以一個(gè)方法體內(nèi)對(duì)請(qǐng)求體進(jìn)行排序組合成鏈?zhǔn)秸{(diào)用再返回
1.@Async的使用
@Async的粒度比較大,在使用的時(shí)候只能添加到方法上,并且需要自定義線程池。
實(shí)現(xiàn):
需要在配置類上添加@Configuration
需要實(shí)現(xiàn)AsyncConfigure接口,里面有兩個(gè)方法可以重寫[getAsyncExecutor,getAsyncUncaughtExceptionHandler],主要實(shí)現(xiàn)的方法是getAsyncExecutor(),
我們當(dāng)時(shí)實(shí)現(xiàn)手動(dòng)注入一個(gè)@Bean。
ps:ThreadPoolTaskExecutor設(shè)計(jì)模式是:模板方法和策略模式
代碼實(shí)現(xiàn):
@Configuration @EnableAsync public class AsyncTaskConfig implements AsyncConfigurer { @Override @Bean public Executor getAsyncExecutor() { /** * ThreadPoolExecutor通用線程池 * ThreadPoolTaskExecutor 是再ThradPoolExecutor上面做增強(qiáng),支持業(yè)務(wù)執(zhí)行任務(wù)、支持定時(shí)任務(wù)、spring的線程管理等 */ ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); threadPoolTaskExecutor.setCorePoolSize(10); threadPoolTaskExecutor.setMaxPoolSize(100); threadPoolTaskExecutor.setQueueCapacity(10); // 設(shè)置線程池全部結(jié)束的時(shí)候才完全關(guān)閉線程 threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); // 當(dāng)線程關(guān)閉的時(shí)候需要等待多長(zhǎng)時(shí)間才進(jìn)行關(guān)閉 threadPoolTaskExecutor.setAwaitTerminationSeconds(60); // 設(shè)置線程的名字 threadPoolTaskExecutor.setThreadNamePrefix("Rabbit-Async-"); // 進(jìn)行初始化 threadPoolTaskExecutor.initialize(); return threadPoolTaskExecutor; } // 需要實(shí)現(xiàn)AsynConfiguration的兩個(gè)方法 @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } }
2.CompletableFuture總體架構(gòu)
Future 它是java5添加的接口,用來(lái)描述一個(gè)異步計(jì)算的結(jié)果,可以用isDone方法來(lái)計(jì)算是否完成,或者使用get阻塞往效用線程,直到計(jì)算返回結(jié)果,可以使用Cancel方法停止任務(wù)執(zhí)行。
CompletableFuture實(shí)現(xiàn)Furure接口,不推薦使用get方式阻塞或者輪詢方式獲取結(jié)果。
CompletableFuture.supplyAsync(Runnable,Executor);//支持返回值
CompletableFutre.runAsync(Runnable,Executor);//不支持返回值
3.計(jì)算完成時(shí)回調(diào)方法
whenComplete(BigConsumer):同步完成正常處理結(jié)果
whenCompleteAsync(BigConsumer):異步完成處理結(jié)果
whenCompleteAysnc(BigConsumer,Executor):異步完成處理結(jié)果
exceptionally(Function):處理異常結(jié)果
串行化與并行化
串行化:程序從上到下執(zhí)行的都是一個(gè)循序
并行化:從上到下執(zhí)行順序不一定
串行化案例
thenApply方法(有返回值):當(dāng)一個(gè)線程依賴另一個(gè)線程是,獲取上一個(gè)任務(wù)返回結(jié)果,并返回當(dāng)前任務(wù)的返回值
thenAccept方法(無(wú)返回值):接受任務(wù)的處理結(jié)果,并消費(fèi)處理,無(wú)返回值結(jié)果。
thenRun方法(最后執(zhí)行):只有上面的任務(wù)執(zhí)行完成,就開始執(zhí)行thenRun,只是處理完任務(wù)后執(zhí)行thenRun的后續(xù)操作。
并行化案例:
多任務(wù)組合
allof().join();:等待所有任務(wù)完成之后返回
anyof():只有一個(gè)任務(wù)完成
到此這篇關(guān)于Java異步線程中的CompletableFuture與@Async詳解的文章就介紹到這了,更多相關(guān)CompletableFuture與@Async內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java的Comparable,Comparator和Cloneable三大接口詳解
這篇文章主要為大家詳細(xì)介紹了Java的Comparable,Comparator和Cloneable的接口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03通過簡(jiǎn)單方法實(shí)現(xiàn)spring boot web項(xiàng)目
這篇文章主要介紹了通過簡(jiǎn)單方法實(shí)現(xiàn)spring boot web項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Java調(diào)用第三方http接口的四種方式總結(jié)
這篇文章主要給大家介紹了關(guān)于Java調(diào)用第三方http接口的四種方式,在實(shí)際開發(fā)中我們經(jīng)常會(huì)與第三方公司進(jìn)行合作,接入第三方接口,文中給出了詳細(xì)的代碼實(shí)例,需要的朋友可以參考下2023-08-08Java代碼性能優(yōu)化的35個(gè)方法總結(jié)
本篇文章主要介紹了Java代碼性能優(yōu)化的35個(gè)方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02java如何使用正則表達(dá)式限制特殊字符的個(gè)數(shù)
這篇文章主要介紹了java如何使用正則表達(dá)式限制特殊字符的個(gè)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11