使用場景:
開發中會碰到一些耗時較長或者不需要立即得到執行結果的邏輯,比如訊息推送、商品同步等都可以使用非同步方法,這時我們可以用到@Async。但是直接使用 @Async 會有風險,當我們沒有指定執行緒池時,他會預設使用其Spring自帶的 SimpleAsyncTaskExecutor 執行緒池,會不斷的建立執行緒,當併發大的時候會嚴重影響效能。所以可以將非同步指定執行緒池使用
簡介:
@Async是Spring的註解,可以加在類或方法上。通俗的來講,如果加上了這個註解,那麼該類或者該方法在使用時將會進行非同步處理,也就是建立一個執行緒來實現這個類或者方法,實現多執行緒。
執行緒池的執行順序:
兩種使用方式:
第一種:
使用的是Spring預設的執行緒池SimpleAsyncTaskExecutor。
接入步驟:
1.需要在@SpringBootApplication啟動類或者@configure註解類上 新增註解@EnableAsync啟動多執行緒註解。
2.在需要非同步執行的方法上新增@Async註解。
預設的執行緒池配置:
如果需要修改預設的配置可以在yaml或者properties中新增,修改預設配置:
執行後會列印出你的執行執行緒名稱:
第二種:(推薦使用)
自定義執行緒池,執行非同步。
自定義執行緒池有如下模式,我們只介紹最後一種:
- 重新實現介面AsyncConfigurer;
- 繼承AsyncConfigurerSupport;
- 配置由自定義的TaskExecutor替代內建的任務執行器。
然後新增註解到對應的方法上並指定執行緒池:asyncExecutor
指定執行緒池的名稱為自定義的執行緒池名稱。
檢視日誌:
注意事項:
查到了@Async失效的幾個原因:
- 註解@Async的方法不是public方法;
- 註解@Async的返回值只能為void或Future;
- 註解@Async方法使用static修飾也會失效;
- 啟動類沒加@EnableAsync註解;
- 呼叫方和@Async不能在一個類中;
- 在Async方法上標註@Transactional是沒用的,但在Async方法呼叫的方法上標註@Transcational是有效的;
作者:京東零售 郭春元
來源:京東雲開發者社群 轉載請註明來源