你真的瞭解@Async嗎?

京東雲開發者發表於2023-11-17

使用場景:

開發中會碰到一些耗時較長或者不需要立即得到執行結果的邏輯,比如訊息推送、商品同步等都可以使用非同步方法,這時我們可以用到@Async。但是直接使用 @Async 會有風險,當我們沒有指定執行緒池時,他會預設使用其Spring自帶的 SimpleAsyncTaskExecutor 執行緒池,會不斷的建立執行緒,當併發大的時候會嚴重影響效能。所以可以將非同步指定執行緒池使用

簡介:

@Async是Spring的註解,可以加在類或方法上。通俗的來講,如果加上了這個註解,那麼該類或者該方法在使用時將會進行非同步處理,也就是建立一個執行緒來實現這個類或者方法,實現多執行緒。

執行緒池的執行順序:

兩種使用方式:

第一種:

使用的是Spring預設的執行緒池SimpleAsyncTaskExecutor。

接入步驟:

1.需要在@SpringBootApplication啟動類或者@configure註解類上 新增註解@EnableAsync啟動多執行緒註解。

2.在需要非同步執行的方法上新增@Async註解。

預設的執行緒池配置:

如果需要修改預設的配置可以在yaml或者properties中新增,修改預設配置:

執行後會列印出你的執行執行緒名稱:

第二種:(推薦使用)

自定義執行緒池,執行非同步。

自定義執行緒池有如下模式,我們只介紹最後一種:

  • 重新實現介面AsyncConfigurer;
  • 繼承AsyncConfigurerSupport;
  • 配置由自定義的TaskExecutor替代內建的任務執行器。

然後新增註解到對應的方法上並指定執行緒池:asyncExecutor

指定執行緒池的名稱為自定義的執行緒池名稱。

檢視日誌:

注意事項:

查到了@Async失效的幾個原因:

  1. 註解@Async的方法不是public方法;
  2. 註解@Async的返回值只能為void或Future;
  3. 註解@Async方法使用static修飾也會失效;
  4. 啟動類沒加@EnableAsync註解;
  5. 呼叫方和@Async不能在一個類中;
  6. 在Async方法上標註@Transactional是沒用的,但在Async方法呼叫的方法上標註@Transcational是有效的;

作者:京東零售 郭春元

來源:京東雲開發者社群 轉載請註明來源

相關文章