@EnableAsync@Async基本使用方法


自己的學習記錄,方便復習,這里只介紹基本的使用方式

一. 基本介紹

@Async是spring為了方便開發人員進行異步調用的出現的,在方法上加入這個注解,spring會從線程池中獲取一個新的線程來執行方法,實現異步調用

@EnableAsync表示開啟對異步任務的支持,可以放在springboot的啟動類上,也可以放在自定義線程池的配置類上,具體看下文

二.最簡單的使用

在springboot項目中,直接在啟動類上加上@EnableAsync,然后在service層的方法上對於需要異步調用的方法加上@Async,

那么當controller層調用這個方法的時候,就會在主線程外自動新建線程執行該方法,具體看下圖demo

1.springboot啟動類開啟異步支持

 

 

 2.service層的方法加@Async,如果在類上加該注解表示整個類的方法都異步執行,建議加到具體的某個方法上

 

 

 3.controller層調用service層的異步方法,這里用主線程在異步方法前后執行了2次打印輸出

 

 

 4.調用的結果

首先看看沒有異步執行,正常的順序執行的結果

可以看到,按順序執行,全部是main線程http-nio-8181-exec-124執行,並且service方法的執行結果在中間,如下所示

 

 

 由於我們的方法使用了@Async注解,所以主線程http-nio-8181-exec-124不等異步方法完成,先結束了,異步線程task-1繼續執行

 

tips:沒有自定義線程池@Async默認的線程池是SimpleAsyncTaskExecutor

三.自定義線程池來使用@Async

1.新建一個線程池配置類,@EnableAsync在配置類上加,不用在啟動類上加也行,可以配置不同的線程池,用bean的name做區分

 

 

 

 2.@Async的使用一樣是在service層的方法上加,如果配置了多個線程池,可以用@Async("name"),那么表示線程池的@Bean的name,來指定用哪個線程池處理

假如只配置了一個線程池,直接用@Async就會用自定義的線程池執行

假如配置了多個線程池,用@Async沒指定用哪個線程池,會用默認的SimpleAsyncTaskExecutor來處理

 

 假如配置了多個線程池,用@Async("name"),會用指定的線程池處理

比如service層方法上指定pool1線程池

 

 執行結果,異步線程名是pool配置的fzhThread

 

 

 四.注解沒生效的原因

1.異步方法使用static修飾

2.異步方法類沒有使用@Service注解(或其他注解)導致spring無法掃描到異步類

3.controller中需要使用@Autowired或@Resource等注解自動注入service類,不能自己手動new對象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM