日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot異步調用方法實現場景代碼實例

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

一、背景  

項目中肯定會遇到異步調用其他方法的場景,比如有個計算過程,需要計算很多個指標的值,但是每個指標計算的效率快慢不同,如果采用同步執行的方式,運行這一個過程的時間是計算所有指標的時間之和。比如:

方法A:計算指標x,指標y,指標z的值,其中計算指標x需要1s,計算指標y需要2s,指標z需要3s。最終執行完方法A就是5s。

現在用異步的方式優化一下

方法A異步調用方法B,方法C,方法D,方法B,方法C,方法D分別計算指標x,指標y,指標z的值,那么最終執行完方法A的時間則是3s。

還有一種用途是當一個業務里面需要多個請求時,這時候異步并發請求所得到的回報遠遠是物有所值的。因為他是異步執行的,話不多說,一下是在springBoot里面使用并發請求;

二、spring boot中異步并發使用

2.1、appllication.yml

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

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(); // 基礎線程數 corePoolSize: 10 executor.setCorePoolSize(corePoolSize); // 最大線程數 maxPoolSize: 15 executor.setMaxPoolSize(maxPoolSize); // 隊列長度 queueCapacity: 25 executor.setQueueCapacity(queueCapacity); // 線程池維護線程所允許的空閑時間,單位為秒 keepAliveSeconds: 200 executor.setKeepAliveSeconds(keepAliveSeconds); // 線程名字 threadNamePrefix: appasync executor.setThreadNamePrefix(threadNamePrefix); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 等待所有任務都完成再繼續銷毀其他的Bean executor.setWaitForTasksToCompleteOnShutdown(true); // 線程池中任務的等待時間,如果超過這個時候還沒有銷毀就強制銷毀,以確保應用最后能夠被關閉,而不是阻塞住 executor.setAwaitTerminationSeconds(awaitTerminationSeconds); executor.initialize(); return executor; }}

2.3、線程池監控(這個可有可無,主要是為了對線程池參數及時的調優)

@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(); // 當前排隊線程數 int queueSize = executor.getQueue().size(); // 當前活動線程數 int activeCount = executor.getActiveCount(); // 執行完線程數 long completedThreadCount = executor.getCompletedTaskCount(); // 總線程數 long taskCount = executor.getTaskCount(); // 初始線程數 int poolSize = executor.getPoolSize(); // 核心線程數 int corePoolSize = executor.getCorePoolSize(); // 線程池是否終止 boolean isTerminated = executor.isTerminated(); // 線城池是否關閉 boolean isShutdown = executor.isShutdown(); // 線程空閑時間 long keepAliveTime = executor.getKeepAliveTime(TimeUnit.MILLISECONDS); // 最大允許線程數 long maximumPoolSize = executor.getMaximumPoolSize(); // 線程池中存在的最大線程數 long largestPoolSize = executor.getLargestPoolSize(); Map<String, Object> threadPoolData = new HashMap<>(18); threadPoolData.put('當前排隊線程數', queueSize); threadPoolData.put('當前活動線程數', activeCount); threadPoolData.put('執行完線程數', completedThreadCount); threadPoolData.put('總線程數', taskCount); threadPoolData.put('初始線程數', poolSize); threadPoolData.put('核心線程數', corePoolSize); threadPoolData.put('線程池是否終止', isTerminated); threadPoolData.put('線城池是否關閉', isShutdown); threadPoolData.put('線程空閑時間', keepAliveTime); threadPoolData.put('最大允許線程數', maximumPoolSize); threadPoolData.put('線程池中存在的最大線程數', 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(){ /** * 先將耗時的、相互之間無依賴的操作先執行,由于其執行結果暫時不是特別關注,所以 */ Future<String> futureA = functionA(); Future<String> futureB = functionB(); /** * 執行其他的操作,其實functionA(),functionB()也在工作 */ aaa(); /** * 獲取異步的結果,然后計算 */ 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('我是'); }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
在线日韩中文| 丝袜a∨在线一区二区三区不卡| 综合国产视频| 久久高清国产| 亚洲一区导航| 日韩1区2区日韩1区2区| 亚洲精品高潮| 欧美日本久久| 免费精品一区| 免费福利视频一区二区三区| 国产精品成人国产| 麻豆精品99| 吉吉日韩欧美| 国产精品av久久久久久麻豆网| 蜜臀av免费一区二区三区| 免费黄色成人| 综合激情网...| 国产精品一区二区中文字幕| 精品国产美女a久久9999| 日本不卡免费高清视频在线| 日韩三区在线| 99国产精品视频免费观看一公开| 久久国产88| 四虎精品一区二区免费| 日本欧美一区二区| 日韩va欧美va亚洲va久久| 国产精品亚洲综合久久| 精品视频黄色| 久久久噜噜噜| 美女黄网久久| 欧美视频久久| 人在线成免费视频| 亚洲一区观看| 国产精品中文字幕亚洲欧美| 日韩一区亚洲二区| 首页国产欧美日韩丝袜| 欧美日韩a区| 亚洲黄色中文字幕| 亚洲综合精品四区| 欧美极品中文字幕| 97精品视频在线看| 香蕉久久99| 日韩精品免费一区二区夜夜嗨| 精品五月天堂| 合欧美一区二区三区| 青青在线精品| 久久国产电影| 国产亚洲精aa在线看| 欧美香蕉视频| 日韩国产欧美视频| 天堂√中文最新版在线| 亚洲影院天堂中文av色| 国产一区精品福利| 亚洲少妇在线| 精品久久国产一区| 欧美日韩国产亚洲一区| 国产色噜噜噜91在线精品| 日韩国产一区二区| 婷婷综合电影| 色吊丝一区二区| 日韩不卡一二三区| 免费欧美一区| 精品国产精品国产偷麻豆 | 亚洲国产成人精品女人| 日本不卡视频在线观看 | 国产精品一区二区美女视频免费看| 樱桃视频成人在线观看| 日韩精品一区二区三区中文字幕| 日韩成人三级| 国产精品多人| 视频在线在亚洲| 久久精品123| 美女av一区| 日韩视频1区| 99久久99视频只有精品| 国产精品欧美一区二区三区不卡| 蜜桃tv一区二区三区| 开心激情综合| 欧美在线综合| 日韩精品久久久久久久电影99爱| 亚洲日产av中文字幕| 久久一区二区三区电影| 国产精品自在| 亚洲精品麻豆| 99xxxx成人网| 91看片一区| 欧美a级一区二区| 中文字幕一区二区三区日韩精品| 群体交乱之放荡娇妻一区二区| 欧美交a欧美精品喷水| 亚洲精品福利| 一区免费在线| 99成人在线视频| 国产粉嫩在线观看| 麻豆精品少妇| 三级久久三级久久久| 亚洲神马久久| 欧美一区二区性| 亚洲伊人av| 精品日韩一区| 国产精品videossex| 日本天堂一区| 日本伊人午夜精品| 亚洲一区二区三区中文字幕在线观看| 天堂日韩电影| 日韩国产欧美一区二区| 精品久久97| 精品视频在线观看网站| 麻豆成人综合网| 久久狠狠久久| 蜜桃视频在线观看一区| 激情五月综合| 久久精品国产大片免费观看| 日韩大片在线| 日韩成人高清| 久久久久网站| 亚洲大片在线| 天堂资源在线亚洲| 五月天久久久| 午夜精品网站| 亚洲免费一区二区| 天堂va蜜桃一区二区三区| 99国产精品久久久久久久成人热| 久久激情网站| 欧美高清一区| 亚洲手机视频| 激情婷婷综合| 久久福利毛片| 日本伊人午夜精品| 国产日韩欧美中文在线| 日韩一区免费| 日本午夜免费一区二区| 国产欧美日韩一区二区三区在线| 日本视频一区二区| 国产精品乱战久久久| 欧美国产中文高清| 岛国精品一区| 国产69精品久久| 日本а中文在线天堂| 日韩av首页| 亚洲一级影院| 亚洲精品99| 蜜桃一区二区三区在线| 日本午夜精品一区二区三区电影| 久久激情五月激情| 精品一区二区三区免费看| 91青青国产在线观看精品| 久久亚洲成人| 亚洲综合中文| 免费在线日韩av| 91精品亚洲| 蜜桃视频免费观看一区| 7777精品| 福利精品在线| 欧美高清一区| 石原莉奈在线亚洲三区| 奇米色欧美一区二区三区| 久久av网站| 久久国产亚洲| 综合干狼人综合首页| 国产精品久久亚洲不卡| 欧美国产一级| 老司机久久99久久精品播放免费| 国产日韩欧美三区| 欧美羞羞视频| 日韩一区二区三区精品视频第3页| 久久亚洲资源中文字| 久久中文字幕av| 日本精品在线播放| 日韩欧美二区| 国产午夜精品一区二区三区欧美| 日韩精品视频网| 日韩免费福利视频| 亚洲美女91| 伊人久久在线| 日韩精品久久久久久| av资源新版天堂在线| 亚洲综合日本| 国产成人精选| 蜜桃av一区二区在线观看| 久久精品亚洲一区二区| 亚洲免费黄色| 欧美极品中文字幕| 亚洲在线电影| 精品成av人一区二区三区| 日韩欧美二区| 日韩av资源网| 99精品在线| 国产精品66| 亚洲欧洲另类| 成人在线视频中文字幕| 综合在线一区| 韩国三级一区| 久久国产精品色av免费看| 久久久久午夜电影| 国产亚洲欧美日韩在线观看一区二区 | 欧美成a人国产精品高清乱码在线观看片在线观看久 | 精品捆绑调教一区二区三区| 亚洲欧洲专区| 久久精品91|