溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring中怎么利用@Async創(chuàng)建異步

發(fā)布時(shí)間:2021-07-30 16:33:00 來源:億速云 閱讀:224 作者:Leah 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)Spring中怎么利用@Async創(chuàng)建異步,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)建異步方法

首先,使用IDEA工具創(chuàng)建Spring-Boot項(xiàng)目,并且選擇依賴包Lombok,具體步驟略。然后創(chuàng)建BusyService類,并創(chuàng)建busyMethod方法,具體如下:

@Service@Slf4jpublic class BusyService {  @Async  publicCompletableFuture<String> busyMethod(String name)       throws InterruptedException {    log.info(name);    Strings = "Hello,"+name+"!";    //模擬耗時(shí)操作,5秒    Thread.sleep(5000);    returnCompletableFuture.completedFuture(s);  }}

其中,BusyService上的注解@Service標(biāo)識(shí)著它會(huì)被Spring初始化為一個(gè)實(shí)例,而@Slf4j則標(biāo)識(shí)著我們可以直接使用log打印日志。然后我們?cè)倏纯碽usyMethod方法,它的返回值是CompletableFuture,CompletableFuture繼承自Future,它可以把多個(gè)異步執(zhí)行的結(jié)果合并到一個(gè)單獨(dú)的異步結(jié)果中,CompletableFuture是任何異步服務(wù)所需要的。我們?cè)倏纯碽usyMethod方法上的注解@Async,這個(gè)注解是我們今天的主角,它標(biāo)識(shí)著這個(gè)方法是異步方法,調(diào)用它時(shí)是異步調(diào)用的。再看看方法體中的內(nèi)容,我們使用了線程休眠模擬那些耗時(shí)的服務(wù),并返回CompletableFuture?! ?br/>

Executor線程池

我們?cè)谙到y(tǒng)定義一個(gè)Executor的Bean,使得異步調(diào)用時(shí),使用Executor線程池的線程去執(zhí)行。這里為了方便,我們直接在Spring-Boot的啟動(dòng)類中增加這個(gè)Bean。

@Beanpublic Executor taskExecutor() {  ThreadPoolTaskExecutor executor = newThreadPoolTaskExecutor();  executor.setCorePoolSize(3);  executor.setMaxPoolSize(3);  executor.setQueueCapacity(500);  executor.setThreadNamePrefix("Java同學(xué)會(huì)-");  executor.initialize();  returnexecutor;}

  

我們定義了最大的并發(fā)線程數(shù)為3,并且定義了隊(duì)列中的最大任務(wù)數(shù)為500,線程名字的前綴為“Java同學(xué)會(huì)”,在log打印日志時(shí),凡是線程池中的線程執(zhí)行的,都會(huì)打印出“Java同學(xué)會(huì)”的線程名字。當(dāng)然你還可以增加一些其他的設(shè)置。如果你不配置Executor這個(gè)Bean,Spring會(huì)自動(dòng)創(chuàng)建SimpleAsyncTaskExecutor,并使用它來執(zhí)行異步方法。

Controller

我們使用一個(gè)簡(jiǎn)單的RestController完成異步的調(diào)用,如下所示:

@SpringBootApplication@RestController@EnableAsync@Slf4jpublic class SpringAsyncApplication {  @Autowired  privateBusyService busyService;  publicstatic void main(String[] args) {    SpringApplication.run(SpringAsyncApplication.class, args);  }  @RequestMapping("test")  publicString test() throws InterruptedException, ExecutionException {    CompletableFuture<String> jane = busyService.busyMethod("Jane");    CompletableFuture<String> allen = busyService.busyMethod("Allen");    CompletableFuture<String> james = busyService.busyMethod("James");    CompletableFuture.allOf(jane,allen,james).join();    log.info(jane.get());    log.info(allen.get());    log.info(james.get());    return"success";  }  @Bean  publicExecutor taskExecutor() {    ……  }}

  

我們?cè)趩?dòng)類上加上@EnableAsync注解,使得Spring-Boot可以使用異步調(diào)用。再看看test()方法,我們調(diào)用了3次異步方法,并等待它們?nèi)客瓿珊?,將它們打印出來。我們啟?dòng)項(xiàng)目,并在瀏覽器中訪問這個(gè)方法,地址是:http://localhost:8080/test。

Spring中怎么利用@Async創(chuàng)建異步

我們?cè)诘却?秒后,頁面上返回了“success”。我們?cè)倏纯春笈_(tái)打印的結(jié)果:

Spring中怎么利用@Async創(chuàng)建異步

 我們看到名字前綴為“Java同學(xué)會(huì)”前綴的3個(gè)線程,打印了busyMethod方法中的日志。因?yàn)閎usyMethod方法是我們定義的Executor線程池中的線程執(zhí)行的。我們?cè)倏纯磘est方法和busyMethod方法中日志打印的時(shí)間,它們相隔了5秒,說明test方法中的CompletableFuture.allOf(jane,allen,james).join()一直在等待,等待所有調(diào)用的異步方法都執(zhí)行完,才繼續(xù)執(zhí)行。

看完上述內(nèi)容,你們對(duì)Spring中怎么利用@Async創(chuàng)建異步有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI