Stories

Detail Return Return

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

使用場景:

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

作者:京東零售 郭春元

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

user avatar zeran Avatar hashdata Avatar devlive Avatar honwhy Avatar birenxuemou Avatar innsane Avatar jwgqwyq Avatar javadog Avatar mengxiang_592395ab95632 Avatar guaiguaidedoujiang_cmg5bc Avatar weirdo_5f6c401c6cc86 Avatar jingzhaoxia Avatar
Favorites 13 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.