springboot中如何使用@Async方法
一.在啟動類上加上 啟動注解 @EnableAsync

二. 在需要進行異步處理的方法上加上注解@ Async
注意事項:
注解的方法 必須是public方法,因為該注解采用的是動態(tài)代理的方式
無論該方法的返回值是什么,被@Async注解的方法必定是Null
在方法內(nèi)不要遞歸調(diào)用,否則無效
三.自定義異步采用的線程池
當我們沒有自定義時,springboot是怎么樣采用默認配置的?

翻譯:當spring執(zhí)行這個方法時,默認會搜索關(guān)聯(lián)的線程池定義。
上下文中唯一的 Spring 框架 TaskExecutor bean 或名為“taskExecutor”的 Executor bean。
如果這兩個都不能解析,默認會使用spring框架SimpleAsyncTaskExecutor來處理異步方法的執(zhí)行。
使用上面的步驟,可以直接使用異步注解了,但是需要注意的是,異步所需的線程池采用的是springboot框架默認的線程池,我們有時候還需要自定義線程池來限制并發(fā)線程數(shù)和最大隊列。
怎么配置異步功能的異步線程池?
法一. 實現(xiàn)配置類 AsyncConfigurer
@Configuration
@EnableAsync
public class BaseAsyncConfigurer implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心線程池數(shù)量,方法: 返回可用處理器的Java虛擬機的數(shù)量。
executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
//最大線程數(shù)量
executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors()*5);
//線程池的隊列容量
executor.setQueueCapacity(Runtime.getRuntime().availableProcessors()*2);
//線程名稱的前綴
executor.setThreadNamePrefix("this-excutor-");
// setRejectedExecutionHandler:當pool已經(jīng)達到max size的時候,如何處理新任務(wù)
// CallerRunsPolicy:不在新線程中執(zhí)行任務(wù),而是由調(diào)用者所在的線程來執(zhí)行
//executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
/*異步任務(wù)中異常處理*/
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (Throwable ex, Method method, Object... params)->{
//todo 異步方法異常處理
System.out.println("class#method: " + method.getDeclaringClass().getName() + "#" + method.getName());
System.out.println("type : " + ex.getClass().getName());
System.out.println("exception : " + ex.getMessage());
};
}
}
實現(xiàn)了這個接口過后,在使用@Async時就會自動使用我們自定義的線程池getAsyncExecutor了。

法二. 自定義一個線程池bean,在使用@Async注解時指定線程池
@Bean("threadPoolTaskExecutor")
public TaskExecutor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(20);
executor.setMaxPoolSize(1000);
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setThreadNamePrefix("Async-");
return executor;
}
使用注解@Async(“threadPoolTaskExecutor”) ,相當于在一個項目中,不同方法上面的@Async可以使用不同的線程池
總結(jié)
一般情況下,建議手動實現(xiàn)AsyncConfigurer來自定義線程池。
如果某些方法需要使用其他的線程池,就使用bean添加一個線程池,并在@Async的value值進行指定線程池。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring activiti如何實現(xiàn)指定任務(wù)處理者
這篇文章主要介紹了Spring activiti如何實現(xiàn)指定任務(wù)處理者,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
java web實現(xiàn)網(wǎng)上手機銷售系統(tǒng)
這篇文章主要為大家詳細介紹了java web實現(xiàn)網(wǎng)上手機銷售系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
JDK?version和class?file?version(Class編譯版本號)對應(yīng)關(guān)系解讀
這篇文章主要介紹了JDK?version和class?file?version(Class編譯版本號)對應(yīng)關(guān)系,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

