av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot中使用多線程的方法示例

瀏覽:81日期:2023-03-20 14:55:33
一、介紹

Spring是通過任務(wù)執(zhí)行器(TaskExecutor)來實(shí)現(xiàn)多線程和并發(fā)編程,使用Spring提供的ThreadPoolTaskExecutor來創(chuàng)建一個(gè)基于線城池的TaskExecutor。在使用線程池的大多數(shù)情況下都是異步非阻塞的。節(jié)省更多的時(shí)間,提高效率。

工作原理

SpringBoot中使用多線程的方法示例

當(dāng)主線程中調(diào)用execute接口提交執(zhí)行任務(wù)時(shí):則執(zhí)行以下步驟:注意:線程池初始時(shí),是空的。

如果當(dāng)前線程數(shù)<corePoolSize,如果是則創(chuàng)建新的線程執(zhí)行該任務(wù) 如果當(dāng)前線程數(shù)>=corePoolSize,則將任務(wù)存入BlockingQueue 如果阻塞隊(duì)列已滿,且當(dāng)前線程數(shù)<maximumPoolSize,則新建線程執(zhí)行該任務(wù)。 如果阻塞隊(duì)列已滿,且當(dāng)前線程數(shù)>=maximumPoolSize,則拋出異常RejectedExecutionException,告訴調(diào)用者無法再接受任務(wù)了。

在Springboot中對(duì)其進(jìn)行了簡化處理,只需要配置一個(gè)類型為java.util.concurrent.TaskExecutor或其子類的bean,并在配置類或直接在程序入口類上聲明注解@EnableAsync,即可可以開啟異步任務(wù)。

調(diào)用也簡單,在由Spring管理的對(duì)象的方法上標(biāo)注注解@Async,聲明是異步任務(wù),顯式調(diào)用即可生效。

二、聲明

讓配置類實(shí)現(xiàn)AsyncConfigurer接口,并重寫getAsyncExecutor方法,并返回一個(gè)ThreasPoolTaskExecutor,就可以獲取一個(gè)基于線程池的TaskExecutor使用注解@EnableAsync開啟異步,會(huì)自動(dòng)掃描

@Configuration@EnableAsyncpublic class ThreadConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(15); executor.setQueueCapacity(25); executor.initialize(); return executor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; }}三、調(diào)用

通過@Async注解表明該方法是異步方法,如果注解在類上,那表明這個(gè)類里面的所有方法都是異步的

@Servicepublic class AsyncTaskService { @Async public void executeAsyncTask(int i) { System.out.println('線程' + Thread.currentThread().getName() + ' 執(zhí)行異步任務(wù):' + i); }}四、進(jìn)階

有時(shí)候我們不止希望異步執(zhí)行任務(wù),還希望任務(wù)執(zhí)行完成后會(huì)有一個(gè)返回值,在java中提供了Future泛型接口,用來接收任務(wù)執(zhí)行結(jié)果,springboot也提供了此類支持,使用實(shí)現(xiàn)了ListenableFuture接口的類如AsyncResult來作為返回值的載體。比如上例中,我們希望返回一個(gè)類型為String類型的值,可以將返回值改造為:

@Async public Future<String> executeAsyncTaskWithResult2(int i) { System.out.println('線程' + Thread.currentThread().getName() + ' 開始執(zhí)行異步任務(wù)' + i); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println('線程' + Thread.currentThread().getName() + ' 結(jié)束執(zhí)行異步任務(wù)' + i); return new AsyncResult<>('線程' + Thread.currentThread().getName() + ' 執(zhí)行異步任務(wù):' + i); }

調(diào)用返回值:get()是阻塞式,等待當(dāng)前線程完成才返回值

public void threadTest() { try { List<Future> futures = new ArrayList<>(); for (int i = 0; i < 20; i++) {futures.add(asyncTaskService.executeAsyncTaskWithResult2(i)); } // 獲取值。get是阻塞式,等待當(dāng)前線程完成才返回值 for (Future<String> future : futures) {System.out.println('返回結(jié)果:' + future.get()); } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } }補(bǔ)充

實(shí)際上,@Async還有一個(gè)參數(shù),通過Bean名稱來指定調(diào)用的線程池-比如上例中設(shè)置的線程池參數(shù)不滿足業(yè)務(wù)需求,可以另外定義合適的線程池,調(diào)用時(shí)指明使用這個(gè)線程池-缺省時(shí)springboot會(huì)優(yōu)先使用名稱為’taskExecutor’的線程池,如果沒有找到,才會(huì)使用其他類型為TaskExecutor或其子類的線程池。

到此這篇關(guān)于SpringBoot中使用多線程的方法示例的文章就介紹到這了,更多相關(guān)SpringBoot使用多線程內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产一级片91 | 亚洲综合久久精品 | 国产欧美在线一区 | 亚洲高清视频在线观看 | 精品日韩一区二区三区av动图 | 成人在线视频观看 | 99免费精品视频 | 国产精品1 | 欧美精品综合在线 | 国产高清视频 | 中文字幕一区二区三区四区五区 | 欧美极品一区二区 | 嫩草91在线 | 久久网一区二区三区 | 超碰在线影院 | 亚洲欧洲一区二区 | 青青草国产在线观看 | 亚洲精品日日夜夜 | 欧美高清性xxxxhdvideosex | 操操日| 97国产精品 | 国产色婷婷精品综合在线手机播放 | av免费成人 | 国产网站在线免费观看 | 日韩精品欧美精品 | 亚洲国产aⅴ精品 | 日韩精品一区二区三区在线播放 | 一级大片网站 | 亚洲天堂久久 | 国产高清精品一区二区三区 | 亚洲a在线观看 | 欧美国产日韩在线观看 | 蜜月va乱码一区二区三区 | 免费一级毛片 | 久久毛片| 欧美a级成人淫片免费看 | 99re视频在线 | 一级大片网站 | 久婷婷| 人人人人干 | 国产精品高潮呻吟久久 |