您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)Spring中怎么利用@Async創(chuàng)建異步,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
首先,使用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/>
我們?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í)行異步方法。
我們使用一個(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。
我們?cè)诘却?秒后,頁面上返回了“success”。我們?cè)倏纯春笈_(tái)打印的結(jié)果:
我們看到名字前綴為“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è)資訊頻道,感謝大家的支持。
免責(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)容。