幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

SpringBoot中如何优雅的使用多线程

  在SpringBoot应用中,经常会遇到在一个接口中,同时做事情1,事情2,事情3,如果同步执行的话,则本次接口时间取决于事情123执行时间之和;如果三件事同时执行,则本次接口时间取决于事情123执行时间最长的那个,合理使用多线程,可以大大缩短接口时间。那么在SpringBoot应用中如何优雅的使用多线程呢?
  Dontbb,showmecode。快速使用
  SpringBoot应用中需要添加EnableAsync注解,来开启异步调用,一般还会配置一个线程池,异步的方法交给特定的线程池完成,如下:ConfigurationEnableAsyncpublicclassAsyncConfiguration{Bean(doSomethingExecutor)publicExecutordoSomethingExecutor(){ThreadPoolTaskExecutorexecutornewThreadPoolTaskExecutor();核心线程数:线程池创建时候初始化的线程数executor。setCorePoolSize(10);最大线程数:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程executor。setMaxPoolSize(20);缓冲队列:用来缓冲执行任务的队列executor。setQueueCapacity(500);允许线程的空闲时间60秒:当超过了核心线程之外的线程在空闲时间到达之后会被销毁executor。setKeepAliveSeconds(60);线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池executor。setThreadNamePrefix(dosomething);缓冲队列满了之后的拒绝策略:由调用线程处理(一般是主线程)executor。setRejectedExecutionHandler(newThreadPoolExecutor。DiscardPolicy());executor。initialize();returnexecutor;}}复制代码
  使用的方式非常简单,在需要异步的方法上加Async注解RestControllerpublicclassAsyncController{AutowiredprivateAsyncServiceasyncService;GetMapping(opensomething)publicStringsomething(){intcount10;for(inti0;icount;i){asyncService。doSomething(indexi);}returnsuccess;}}Slf4jServicepublicclassAsyncService{指定使用beanname为doSomethingExecutor的线程池Async(doSomethingExecutor)publicStringdoSomething(Stringmessage){log。info(dosomething,message{},message);try{Thread。sleep(1000);}catch(InterruptedExceptione){log。error(dosomethingerror:,e);}returnmessage;}}复制代码
  访问:127。0。0。1:8080opensomething,日志如下2020041923:42:42。486INFO21168〔io8200exec17〕x。g。b。system。controller。AsyncController:dosomethingend,time8milliseconds2020041923:42:42。488INFO21168〔dosomething1〕x。gits。boot。system。service。AsyncService:dosomething,messageindex02020041923:42:42。488INFO21168〔dosomething5〕x。gits。boot。system。service。AsyncService:dosomething,messageindex42020041923:42:42。488INFO21168〔dosomething4〕x。gits。boot。system。service。AsyncService:dosomething,messageindex32020041923:42:42。488INFO21168〔dosomething6〕x。gits。boot。system。service。AsyncService:dosomething,messageindex52020041923:42:42。488INFO21168〔dosomething9〕x。gits。boot。system。service。AsyncService:dosomething,messageindex82020041923:42:42。488INFO21168〔dosomething8〕x。gits。boot。system。service。AsyncService:dosomething,messageindex72020041923:42:42。488INFO21168〔dosomething10〕x。gits。boot。system。service。AsyncService:dosomething,messageindex92020041923:42:42。488INFO21168〔dosomething7〕x。gits。boot。system。service。AsyncService:dosomething,messageindex62020041923:42:42。488INFO21168〔dosomething2〕x。gits。boot。system。service。AsyncService:dosomething,messageindex12020041923:42:42。488INFO21168〔dosomething3〕x。gits。boot。system。service。AsyncService:dosomething,messageindex2复制代码
  由此可见已经达到异步执行的效果了,并且使用到了咱们配置的线程池。获取异步方法返回值
  当异步方法有返回值时,如何获取异步方法执行的返回结果呢?这时需要异步调用的方法带有返回值CompletableFuture。
  CompletableFuture是对Feature的增强,Feature只能处理简单的异步任务,而CompletableFuture可以将多个异步任务进行复杂的组合。如下:RestControllerpublicclassAsyncController{AutowiredprivateAsyncServiceasyncService;SneakyThrowsApiOperation(异步有返回值)GetMapping(opensomethings)publicStringsomethings(){CompletableFutureStringcreateOrderasyncService。doSomething1(createorder);CompletableFutureStringreduceAccountasyncService。doSomething2(reduceaccount);CompletableFutureStringsaveLogasyncService。doSomething3(savelog);等待所有任务都执行完CompletableFuture。allOf(createOrder,reduceAccount,saveLog)。join();获取每个任务的返回结果StringresultcreateOrder。get()reduceAccount。get()saveLog。get();returnresult;}}Slf4jServicepublicclassAsyncService{Async(doSomethingExecutor)publicCompletableFutureStringdoSomething1(Stringmessage)throwsInterruptedException{log。info(dosomething1:{},message);Thread。sleep(1000);returnCompletableFuture。completedFuture(dosomething1:message);}Async(doSomethingExecutor)publicCompletableFutureStringdoSomething2(Stringmessage)throwsInterruptedException{log。info(dosomething2:{},message);Thread。sleep(1000);returnCompletableFuture。completedFuture(;dosomething2:message);}Async(doSomethingExecutor)publicCompletableFutureStringdoSomething3(Stringmessage)throwsInterruptedException{log。info(dosomething3:{},message);Thread。sleep(1000);returnCompletableFuture。completedFuture(;dosomething3:message);}}复制代码
  访问接口C:UsersAdministratorcurlXGEThttp:localhost:8200opensomethingsHaccept:dosomething1:createorder;dosomething2:reduceaccount;dosomething3:savelog复制代码
  控制台上关键日志如下:2020042000:27:42。238INFO5672〔dosomething3〕x。gits。boot。system。service。AsyncService:dosomething3:savelog2020042000:27:42。238INFO5672〔dosomething2〕x。gits。boot。system。service。AsyncService:dosomething2:reduceaccount2020042000:27:42。238INFO5672〔dosomething1〕x。gits。boot。system。service。AsyncService:dosomething1:createorder复制代码注意事项
  Async注解会在以下几个场景失效,也就是说明明使用了Async注解,但就没有走多线程。异步方法使用static关键词修饰;异步类不是一个Spring容器的bean(一般使用注解Component和Service,并且能被Spring扫描到);SpringBoot应用中没有添加EnableAsync注解;在同一个类中,一个方法调用另外一个有Async注解的方法,注解不会生效。原因是Async注解的方法,是在代理类中执行的。
  需要注意的是:异步方法使用注解Async的返回值只能为void或者Future及其子类,当返回结果为其他类型时,方法还是会异步执行,但是返回值都是null,部分源码如下:
  AsyncExecutionInterceptorinvoke
  通过上边几个示例,Async实际还是通过Future或CompletableFuture来异步执行的,Spring又封装了一下,让我们使用的更方便。

看到黑丝就心动,见色起意还是正常反应?其实有可能是心理疾病!每到春暖花开的季节,满大街的丝袜美腿都刺激着很多人的眼球,拼命告诉自己不要一直盯着看,视线却不受控制的挪不开。这种让人对自我产生怀疑的现象到底是因为什么?是自己太色了,还是男人……NBA一夜6大交易动态追梦湖人会打进西决湖人勇士商讨追梦交易一:莫兰特谈MVP榜第一:我要超越罗斯拿下最年轻的MVP今天灰熊当家球星莫兰特,荣获首周MVP榜第一,为此他在采访中谈到了此事,这个赛季我的目标就是拿下MVP,超越罗斯最……曝21岁朱小伟想当大官,大衣哥花500W举荐儿子当村长,网友作为朱楼村飞出来的金凤凰,大衣哥朱之文走红后为村子做了不少实事,也帮助了不少家境困难的同村人,这让他在村子里的威望非常高,得到众人的敬重与喜爱。因此每当村里选举时,都有不少村民……国庆节家宴吃啥?8个菜谱准备好了,简单易学,有荤有素家人爱吃十一国庆节,祖国母亲的生日,锦绣山河,普天同庆,大家也有了难得的7天小长假。家人团聚在一起,少不了一顿丰盛的家宴,吃什么好多人又犯了愁,那么有没有好吃又简单,适合国庆节在家烹饪……nba球队总冠军数一览漫漫nba历史的征途中,许多球队在经历了历代的更迭,球员的更替,队名的改变,造就了如今吸引着世界人民目光的nba。如今的nba分为东西部两个赛区,并进行总冠军的角逐,激动人心……一款小小充电器近300元用料如何?贝尔金65W氮化镓快充拆解前言贝尔金推出了一款65W双口氮化镓充电器,白色柱状外壳,对应输入端折叠插脚一面和输出USBC口一面为收口处理,外观非常有特点。充电器为双USBC接口,单口输出支持65W……成品油再迎调价窗口多地95或重回9元时代中新经纬11月7日电(付健青)11月7日24时,国内成品油新一轮调价窗将开启。机构普遍预计,国内成品油价格将再度上调。本轮计价周期内,多空因素交织,国际油价震荡走高,美油……女童哭喊手疼!送医检查后,医生再晚一点就截肢了家有萌娃乐趣多。可有时候,在看护孩子的时候,真感觉自己像个24小时战斗机,特别是照看低龄儿童时。稍不注意,就可能发生我们意想不到的事情:车祸、溺水、高空坠落、……又是邢台我们不宜相逢,却从不陌生若是以往,能够在此刻坚持读完我的文字的人,要么是闲散时光里的大妈大姐,要么是自由从业者中高冷范儿且爱附庸风雅的行业领袖或江河大哥。文学青年咱就另当别论了,苦逼的上班族绝对不吃这……最近火了一件外套叫机车服,时髦又吸睛,明星潮人都上头了帅气从来都不是只用来形容男性的,女生也完全能够把握帅气的穿搭,今天用我们来推荐的这件机车服塑造适合女性的时髦帅气穿搭吧。机车服乍一听你可能觉得不太熟悉,但是说皮衣的话,相……人生在世,心如止水人活在世间,难免会被各种各样的欲望所纠缠。有了欲望,自然就有烦恼,欲望越多,烦恼越多。被誉为一代传奇、中国人的心灵导师的弘一法师李叔同,也与你我一样,曾困于世间的烦恼之中……拍照手机哪家强?我只推荐这三款,每一款都是拍摄神器现如今的手机真是越来越注重拍摄性能,尤其是各大品牌像华为、vivo等都推出了几款主打拍摄的机型,不仅能满足简单地记录日常,甚至部分机型已经向专业摄影标准靠拢,今天我们分享三款拍……
欧文轰296仍无缘今日最佳!对不起!你遇到创奇迹的哈登了北京时间1月9日,联盟有众多球员发挥出色,比如欧文就是其中一位,在篮网102101险胜热火的比赛中,欧文全场21投10中,三分球15投6中,罚球4中3得到29分6助攻。欧文全场……春节期间值得买的三款手机,各个配置内卷,流畅用五年无压力前段时间手机新机频频发布,手机配置也堆料十足。春节马上要到了,今天给大家推荐四款手机,有换手机打算的朋友们可以看看。vivoX90vivoX90正面来看,是一块6。78英……顽皮狗最后生还者设想就是生化危机的反面在2000年代末和2010年代初,当时的娱乐媒体充斥着丧尸题材,这也同样适用于游戏。当《最后的生还者》刚公布时,许多人很容易把它误认为是另一款普通的丧尸游戏,玩家可以到处打丧尸……1月6号铜铝锡铅锌及废旧有色金属行情参考长江现货:1铜:6521065250元吨,涨860元。A00铝:1768017720元吨,跌30元。1铅:1557515675元吨,跌50元。0锌:23440……塔图姆大心脏,绿凯5分险胜,双核爆砍638,马刺8人得分上双北京时间1月8日,NBA常规赛,排名联盟第一的凯尔特人做客面对西部倒数第二的马刺。此役,作为老牌劲旅,马刺展现出了足够的韧性,在最多落后15分的情况下,马刺一度将分差缩小到1分……许昕34岁妻子重上赛场,身材高挑皮肤白皙,和丁宁欢乐互动北京时间1月7日,国乒运动员许昕和同是运动员出身的妻子姚彦所开的运动场,姚彦也出现在现场,穿着一身黑色运动衣的她,皮肤白皙,笑起来爽朗可爱,手持红色乒乓球拍,在阔别已久的乒乓球……散文人生回味,知足常乐,也是一种幸福作者:子墨时序更迭的时光里,一切都在跟随四季辗转,繁华落尽的时候,面对简静的风景,感悟内心的风景,也是一种幸福。一年时光很是短暂,珍惜拥有,却要付出深情,即便如此,……大S失去体面,应该学学张柏芝的母爱,赵丽颖的事业心大s和汪小菲的账单,床单问题,算得上是2022年12月最火热的话题,两人的瓜是越被爆料越有意思,面对大s的所作所为,网友表示,大s不仅事业上干得漂亮,就连离婚后,也能把汪小菲拿……武汉蔡甸时光农场为游客带来沉浸式怀旧休闲体验农耕文化与旅游相融合会擦出怎样的火花?位于武汉市蔡甸区侏儒山街道的香根湖畔时光农场以农业怀旧体验团建为模式,致力于打造农业休闲综合体,以沉浸式怀旧休闲体验,吸引城市……为什么癌症越来越多呢?医生直言五种做菜习惯或致癌,趁早改正谈癌色变。癌症在生活中频繁被提起,逐渐成为人类健康的第一杀手。虽然现在医疗技术不断进步,但是癌症仍然是没有办法治愈的,只能通过相关治疗延缓病情的发展,提高后期生存质量。俗……字母哥联盟第一人,詹皇库里都无法单换字母哥已是当今联盟第一人,两个MVP,两个FMVP,两个总冠军,正值职业生涯巅峰,每个赛季都有机会冲击总冠军,并且人气高,商业价值大,28岁还有无限遐想空间,那么谁可以单换到他……三十年不忘我与一只鸟儿的故事灰灰走了,生活还在继续。生命就是这样,不到最后一刻,你永远不会知道自己面对的是一出悲剧还是喜剧。遇到灰灰那一年,我十二岁,刚上五年级。与灰灰的相逢,源自一次意外,因为淘气……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网