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

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

從網(wǎng)站建設到定制行業(yè)解決方案,為提供做網(wǎng)站、成都網(wǎng)站制作服務體系,各種行業(yè)企業(yè)客戶提供網(wǎng)站建設解決方案,助力業(yè)務快速發(fā)展。創(chuàng)新互聯(lián)將不斷加快創(chuàng)新步伐,提供優(yōu)質的建站服務。

創(chuàng)建異步方法

首先,使用IDEA工具創(chuàng)建Spring-Boot項目,并且選擇依賴包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+"!";    //模擬耗時操作,5秒    Thread.sleep(5000);    returnCompletableFuture.completedFuture(s);  }}

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

Executor線程池

我們在系統(tǒng)定義一個Executor的Bean,使得異步調用時,使用Executor線程池的線程去執(zhí)行。這里為了方便,我們直接在Spring-Boot的啟動類中增加這個Bean。

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

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

Controller

我們使用一個簡單的RestController完成異步的調用,如下所示:

@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() {    ……  }}

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

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

我們在等待了5秒后,頁面上返回了“success”。我們再看看后臺打印的結果:

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

 我們看到名字前綴為“Java同學會”前綴的3個線程,打印了busyMethod方法中的日志。因為busyMethod方法是我們定義的Executor線程池中的線程執(zhí)行的。我們再看看test方法和busyMethod方法中日志打印的時間,它們相隔了5秒,說明test方法中的CompletableFuture.allOf(jane,allen,james).join()一直在等待,等待所有調用的異步方法都執(zhí)行完,才繼續(xù)執(zhí)行。

看完上述內(nèi)容,你們對Spring中怎么利用@Async創(chuàng)建異步有進一步的了解嗎?如果還想了解更多知識或者相關內(nèi)容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

文章題目:Spring中怎么利用@Async創(chuàng)建異步
標題URL:http://muchs.cn/article6/johcig.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、網(wǎng)站策劃企業(yè)建站、企業(yè)網(wǎng)站制作手機網(wǎng)站建設、網(wǎng)站設計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設