@Async的用法和示例

@Async 注解的用法和示例背景異步調(diào)用@Async介紹在Spring中啟用@Async示例一:基本使用方式示例二:在同一個類中調(diào)用異步方法示例三:異步方法是static方法示例四:在方法級別上修改默認(rèn)的執(zhí)行器
背景
通常,在Java中的方法調(diào)用都是同步調(diào)用,比如在A方法中調(diào)用了B方法,則在A調(diào)用B方法之后,必須等待B方法執(zhí)行并返回后,AB方法執(zhí)行時間較長,則可能會導(dǎo)致調(diào)用A的請求響應(yīng)遲緩,為了解決這種問題,可以使用Spirng的注解@Async來用異步調(diào)用的方式處理,當(dāng)然也會有別的多線程方式解決此類問題,本文主要分析@Async在解決此類問題時的用法以及具體的示例。
異步調(diào)用
比如方法A調(diào)用方法B,如果B是一個異步方法,則A方法在調(diào)用B方法之后,不用等待B方法執(zhí)行完成,而是直接往下繼續(xù)執(zhí)行別的代碼。
@Async介紹
在Spring中,使用@Async標(biāo)注某方法,可以使該方法變成異步方法,這些方法在被調(diào)用的時候,將會在獨立的線程中進行執(zhí)行,調(diào)用者不需等待該方法執(zhí)行完成。
在Spring中啟用@Async
使用@EnableAsync
示例一:基本使用方式
在方法上添加@Async注解
調(diào)用異步方法
執(zhí)行結(jié)果

從執(zhí)行結(jié)果可以看出,main線程中的func1方法在調(diào)用異步方法test2后,沒有等待test2方法執(zhí)行完成,直接執(zhí)行后面的代碼。
示例二:在同一個類中調(diào)用異步方法
方法func2和上面的異步方法test2方法在同一個類中

從執(zhí)行結(jié)果可知,main線程中的func2方法在調(diào)用異步方法test2方法后,等待test2方法執(zhí)行完后,才繼續(xù)往后執(zhí)行。
示例三:異步方法是static方法
異步方法test3是一個static方法
調(diào)用test3的方法
執(zhí)行結(jié)果。可以看出在static方法上添加@Async注解,當(dāng)調(diào)用該方法時并沒有新啟用一個線程單獨執(zhí)行,而是按順序執(zhí)行代碼,說明異步無效。

示例四:在方法級別上修改默認(rèn)的執(zhí)行器
自定義一個線程池執(zhí)行器代替默認(rèn)的執(zhí)行器
自定義的線程池執(zhí)行器
異步方法上使用自定義的執(zhí)行器
調(diào)用test4異步方法
從執(zhí)行結(jié)果可以看出,@Async注解聲明使用指定的自定義的異步執(zhí)行器,已經(jīng)替換了默認(rèn)的執(zhí)行器。而且調(diào)用異步方法的main線程沒有等待異步方法的執(zhí)行。
說明:新建自定義的執(zhí)行器后,注解@Async默認(rèn)就會替換成自定義的執(zhí)行器,所以在@Async注解上可以不用指定。

1.01^{365} ≈ 37.7834343329 ? 0.99^{365} ≈ 0.02551796445 ? 相信堅持的力量!