@Async的用法和示例

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

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

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

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

1.01^{365} ≈ 37.7834343329 ? 0.99^{365} ≈ 0.02551796445 ? 相信堅(jiān)持的力量!