你真的瞭解@Async嗎? | 京東雲技術團隊

使用場景:

開發中會碰到一些耗時較長或者不需要立即得到執行結果的邏輯,比如消息推送、商品同步等都可以使用異步方法,這時我們可以用到@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是有效的;

作者:京東零售 郭春元

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章