久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

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

SpringBoot異步調(diào)用方法實(shí)現(xiàn)場景代碼實(shí)例

瀏覽:49日期:2023-05-24 16:14:08

一、背景  

項(xiàng)目中肯定會(huì)遇到異步調(diào)用其他方法的場景,比如有個(gè)計(jì)算過程,需要計(jì)算很多個(gè)指標(biāo)的值,但是每個(gè)指標(biāo)計(jì)算的效率快慢不同,如果采用同步執(zhí)行的方式,運(yùn)行這一個(gè)過程的時(shí)間是計(jì)算所有指標(biāo)的時(shí)間之和。比如:

方法A:計(jì)算指標(biāo)x,指標(biāo)y,指標(biāo)z的值,其中計(jì)算指標(biāo)x需要1s,計(jì)算指標(biāo)y需要2s,指標(biāo)z需要3s。最終執(zhí)行完方法A就是5s。

現(xiàn)在用異步的方式優(yōu)化一下

方法A異步調(diào)用方法B,方法C,方法D,方法B,方法C,方法D分別計(jì)算指標(biāo)x,指標(biāo)y,指標(biāo)z的值,那么最終執(zhí)行完方法A的時(shí)間則是3s。

還有一種用途是當(dāng)一個(gè)業(yè)務(wù)里面需要多個(gè)請求時(shí),這時(shí)候異步并發(fā)請求所得到的回報(bào)遠(yuǎn)遠(yuǎn)是物有所值的。因?yàn)樗钱惒綀?zhí)行的,話不多說,一下是在springBoot里面使用并發(fā)請求;

二、spring boot中異步并發(fā)使用

2.1、appllication.yml

#****************集成Async線程池開始*******************async: # Async線程池 配置 executor: corepoolsize: 20 maxpoolsize: 25 queuecapacity: 40 keepaliveseconds: 200 threadnameprefix: appasync awaitterminationseconds: 60#*****************集成Async線程池結(jié)束******************

2.2、配置線程池

@Configuration@EnableAsyncpublic class ExecutorConfig { @Value('${async.executor.corepoolsize}') private Integer corePoolSize; @Value('${async.executor.maxpoolsize}') private Integer maxPoolSize; @Value('${async.executor.queuecapacity}') private Integer queueCapacity; @Value('${async.executor.keepaliveseconds}') private Integer keepAliveSeconds; @Value('${async.executor.threadnameprefix}') private String threadNamePrefix; @Value('${async.executor.awaitterminationseconds}') private Integer awaitTerminationSeconds; /** * 線程池 * * @return */ @Bean(name = 'asyncExecutor') public Executor asyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 基礎(chǔ)線程數(shù) corePoolSize: 10 executor.setCorePoolSize(corePoolSize); // 最大線程數(shù) maxPoolSize: 15 executor.setMaxPoolSize(maxPoolSize); // 隊(duì)列長度 queueCapacity: 25 executor.setQueueCapacity(queueCapacity); // 線程池維護(hù)線程所允許的空閑時(shí)間,單位為秒 keepAliveSeconds: 200 executor.setKeepAliveSeconds(keepAliveSeconds); // 線程名字 threadNamePrefix: appasync executor.setThreadNamePrefix(threadNamePrefix); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 等待所有任務(wù)都完成再繼續(xù)銷毀其他的Bean executor.setWaitForTasksToCompleteOnShutdown(true); // 線程池中任務(wù)的等待時(shí)間,如果超過這個(gè)時(shí)候還沒有銷毀就強(qiáng)制銷毀,以確保應(yīng)用最后能夠被關(guān)閉,而不是阻塞住 executor.setAwaitTerminationSeconds(awaitTerminationSeconds); executor.initialize(); return executor; }}

2.3、線程池監(jiān)控(這個(gè)可有可無,主要是為了對線程池參數(shù)及時(shí)的調(diào)優(yōu))

@RestController@Slf4j@RequestMapping('/pubapi/asyncExecutor')public class AsyncExecutorController extends BaseController { @Resource(name = 'asyncExecutor') private Executor asyncExecutor; @PostMapping('/monitor')public ResultBean<Map<String, Object>> getAsyncExecutorData() { ResultBean<Map<String, Object>> resultBean = ResultBeanUtil.error500(); if (asyncExecutor == null) { return resultBean; } try { ThreadPoolTaskExecutor executorTask = (ThreadPoolTaskExecutor) asyncExecutor; ThreadPoolExecutor executor = executorTask.getThreadPoolExecutor(); // 當(dāng)前排隊(duì)線程數(shù) int queueSize = executor.getQueue().size(); // 當(dāng)前活動(dòng)線程數(shù) int activeCount = executor.getActiveCount(); // 執(zhí)行完線程數(shù) long completedThreadCount = executor.getCompletedTaskCount(); // 總線程數(shù) long taskCount = executor.getTaskCount(); // 初始線程數(shù) int poolSize = executor.getPoolSize(); // 核心線程數(shù) int corePoolSize = executor.getCorePoolSize(); // 線程池是否終止 boolean isTerminated = executor.isTerminated(); // 線城池是否關(guān)閉 boolean isShutdown = executor.isShutdown(); // 線程空閑時(shí)間 long keepAliveTime = executor.getKeepAliveTime(TimeUnit.MILLISECONDS); // 最大允許線程數(shù) long maximumPoolSize = executor.getMaximumPoolSize(); // 線程池中存在的最大線程數(shù) long largestPoolSize = executor.getLargestPoolSize(); Map<String, Object> threadPoolData = new HashMap<>(18); threadPoolData.put('當(dāng)前排隊(duì)線程數(shù)', queueSize); threadPoolData.put('當(dāng)前活動(dòng)線程數(shù)', activeCount); threadPoolData.put('執(zhí)行完線程數(shù)', completedThreadCount); threadPoolData.put('總線程數(shù)', taskCount); threadPoolData.put('初始線程數(shù)', poolSize); threadPoolData.put('核心線程數(shù)', corePoolSize); threadPoolData.put('線程池是否終止', isTerminated); threadPoolData.put('線城池是否關(guān)閉', isShutdown); threadPoolData.put('線程空閑時(shí)間', keepAliveTime); threadPoolData.put('最大允許線程數(shù)', maximumPoolSize); threadPoolData.put('線程池中存在的最大線程數(shù)', largestPoolSize); InetAddress inetAddress = IdWorker.getLocalHostLANAddress(); Map<String, Object> resultData = new HashMap<>(4); resultData.put('ip', inetAddress.getHostAddress()); resultData.put('threadPoolData', threadPoolData); resultBean = ResultBeanUtil.success('請求成功!', resultData); } catch (Exception e) { e.printStackTrace(); } return resultBean; }}

2.4、代碼中使用

public void getMap(){ /** * 先將耗時(shí)的、相互之間無依賴的操作先執(zhí)行,由于其執(zhí)行結(jié)果暫時(shí)不是特別關(guān)注,所以 */ Future<String> futureA = functionA(); Future<String> futureB = functionB(); /** * 執(zhí)行其他的操作,其實(shí)functionA(),functionB()也在工作 */ aaa(); /** * 獲取異步的結(jié)果,然后計(jì)算 */ try { String resultA =futureA.get(); String resuleB = futureB.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } public Future<String> functionA (){ Future<String> future = null; try { Thread.sleep(5000); future = new AsyncResult<String>('functionA'); } catch (InterruptedException e) { e.printStackTrace(); } return future; } public Future<String> functionB (){ Future<String> future = null; try { Thread.sleep(3000); future = new AsyncResult<String>('functionB'); } catch (InterruptedException e) { e.printStackTrace(); } return future; } public void aaa(){ System.out.println('我是'); }

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产成人免费 | 1000部羞羞视频在线看视频 | 亚洲二区在线 | 亚洲成人日本 | 国产a一三三四区电影 | 国内精品视频一区二区三区 | 日韩在线观看视频一区二区 | 亚洲精选久久久 | 亚洲一区二区福利 | 4hu网站 | 手机看片369| 99视频在线| 成人欧美一区二区三区黑人孕妇 | 午夜精品视频在线观看 | 亚洲国产婷婷香蕉久久久久久99 | 欧美一区二区三区成人 | 高清国产午夜精品久久久久久 | 日韩中文在线 | 亚洲一区二区三区高清 | 国产成人免费在线 | 欧美日韩中文 | 91精品国产乱码久久久久久 | 毛片免费视频 | 亚洲天堂一区二区 | 日韩在线播放欧美字幕 | 白浆在线播放 | 日韩一级视频 | 99热精品免费 | 婷婷久久综合九色综合绿巨人 | 国产精品色婷婷亚洲综合看 | 在线免费毛片 | 欧美一级精品片在线看 | 日韩在线欧美 | 精品一区二区三区在线观看视频 | 亚洲一区二区三区久久久 | 日本中文字幕视频 | 香蕉久久一区二区不卡无毒影院 | 中文天堂在线观看视频 | 人人插人 | 午夜欧美| jizz在亚洲|