当前位置: 首页>行业 >

[线程池]Springboot如何使用线程池

来源: 腾讯云 | 时间: 2023-03-18 01:22:59 |

本文带你快速了解@Async注解的用法,包括异步方法无返回值、有返回值,最后总结了@Async注解失效的几个坑。

在 SpringBoot 应用中,经常会遇到在一个接口中,同时做事情1,事情2,事情3,如果同步执行的话,则本次接口时间取决于事情1 2 3执行时间之和;如果三件事同时执行,则本次接口时间取决于事情1 2 3执行时间最长的那个,合理使用多线程,可以大大缩短接口时间。那么在 SpringBoot 应用中如何优雅的使用多线程呢?

Don"t bb, show me code.


(资料图片)

快速使用

SpringBoot应用中需要添加@EnableAsync注解,来开启异步调用,一般还会配置一个线程池,异步的方法交给特定的线程池完成,如下:

@Configuration@EnableAsyncpublic class AsyncConfiguration {    @Bean("doSomethingExecutor")    public Executor doSomethingExecutor() {        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();        // 核心线程数:线程池创建时候初始化的线程数        executor.setCorePoolSize(10);        // 最大线程数:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程        executor.setMaxPoolSize(20);        // 缓冲队列:用来缓冲执行任务的队列        executor.setQueueCapacity(500);        // 允许线程的空闲时间60秒:当超过了核心线程之外的线程在空闲时间到达之后会被销毁        executor.setKeepAliveSeconds(60);        // 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池        executor.setThreadNamePrefix("do-something-");        // 缓冲队列满了之后的拒绝策略:由调用线程处理(一般是主线程)        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());        executor.initialize();        return executor;    }}

使用的方式非常简单,在需要异步的方法上加@Async注解

@RestControllerpublic class AsyncController {    @Autowired    private AsyncService asyncService;    @GetMapping("/open/something")    public String something() {        int count = 10;        for (int i = 0; i < count; i++) {            asyncService.doSomething("index = " + i);        }        lon        return "success";    }}@Slf4j@Servicepublic class AsyncService {    // 指定使用beanname为doSomethingExecutor的线程池    @Async("doSomethingExecutor")    public String doSomething(String message) {        log.info("do something, message={}", message);        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            log.error("do something error: ", e);        }        return message;    }}

访问:127.0.0.1:8080/open/something,日志如下

2020-04-19 23:42:42.486  INFO 21168 --- [io-8200-exec-17] x.g.b.system.controller.AsyncController  : do something end, time 8 milliseconds2020-04-19 23:42:42.488  INFO 21168 --- [ do-something-1] x.gits.boot.system.service.AsyncService  : do something, message=index = 02020-04-19 23:42:42.488  INFO 21168 --- [ do-something-5] x.gits.boot.system.service.AsyncService  : do something, message=index = 42020-04-19 23:42:42.488  INFO 21168 --- [ do-something-4] x.gits.boot.system.service.AsyncService  : do something, message=index = 32020-04-19 23:42:42.488  INFO 21168 --- [ do-something-6] x.gits.boot.system.service.AsyncService  : do something, message=index = 52020-04-19 23:42:42.488  INFO 21168 --- [ do-something-9] x.gits.boot.system.service.AsyncService  : do something, message=index = 82020-04-19 23:42:42.488  INFO 21168 --- [ do-something-8] x.gits.boot.system.service.AsyncService  : do something, message=index = 72020-04-19 23:42:42.488  INFO 21168 --- [do-something-10] x.gits.boot.system.service.AsyncService  : do something, message=index = 92020-04-19 23:42:42.488  INFO 21168 --- [ do-something-7] x.gits.boot.system.service.AsyncService  : do something, message=index = 62020-04-19 23:42:42.488  INFO 21168 --- [ do-something-2] x.gits.boot.system.service.AsyncService  : do something, message=index = 12020-04-19 23:42:42.488  INFO 21168 --- [ do-something-3] x.gits.boot.system.service.AsyncService  : do something, message=index = 2

由此可见已经达到异步执行的效果了,并且使用到了咱们配置的线程池。

获取异步方法返回值

当异步方法有返回值时,如何获取异步方法执行的返回结果呢?这时需要异步调用的方法带有返回值CompletableFuture。

CompletableFuture是对Feature的增强,Feature只能处理简单的异步任务,而CompletableFuture可以将多个异步任务进行复杂的组合。如下:

@RestControllerpublic class AsyncController {    @Autowired    private AsyncService asyncService;    @SneakyThrows    @ApiOperation("异步 有返回值")    @GetMapping("/open/somethings")    public String somethings() {        CompletableFuture createOrder = asyncService.doSomething1("create order");        CompletableFuture reduceAccount = asyncService.doSomething2("reduce account");        CompletableFuture saveLog = asyncService.doSomething3("save log");        // 等待所有任务都执行完        CompletableFuture.allOf(createOrder, reduceAccount, saveLog).join();        // 获取每个任务的返回结果        String result = createOrder.get() + reduceAccount.get() + saveLog.get();        return result;    }}@Slf4j@Servicepublic class AsyncService {    @Async("doSomethingExecutor")    public CompletableFuture doSomething1(String message) throws InterruptedException {        log.info("do something1: {}", message);        Thread.sleep(1000);        return CompletableFuture.completedFuture("do something1: " + message);    }    @Async("doSomethingExecutor")    public CompletableFuture doSomething2(String message) throws InterruptedException {        log.info("do something2: {}", message);        Thread.sleep(1000);        return CompletableFuture.completedFuture("; do something2: " + message);    }    @Async("doSomethingExecutor")    public CompletableFuture doSomething3(String message) throws InterruptedException {        log.info("do something3: {}", message);        Thread.sleep(1000);        return CompletableFuture.completedFuture("; do something3: " + message);    }}

访问接口

C:\Users\Administrator>curl -X GET "http://localhost:8200/open/somethings" -H "accept: */*"do something1: create order; do something2: reduce account; do something3: save log

控制台上关键日志如下:

2020-04-20 00:27:42.238  INFO 5672 --- [ do-something-3] x.gits.boot.system.service.AsyncService  : do something3: save log2020-04-20 00:27:42.238  INFO 5672 --- [ do-something-2] x.gits.boot.system.service.AsyncService  : do something2: reduce account2020-04-20 00:27:42.238  INFO 5672 --- [ do-something-1] x.gits.boot.system.service.AsyncService  : do something1: create order

注意事项

@Async注解会在以下几个场景失效,也就是说明明使用了@Async注解,但就没有走多线程。

异步方法使用static关键词修饰;异步类不是一个Spring容器的bean(一般使用注解@Component@Service,并且能被Spring扫描到);SpringBoot应用中没有添加@EnableAsync注解;在同一个类中,一个方法调用另外一个有@Async注解的方法,注解不会生效。原因是@Async注解的方法,是在代理类中执行的。

通过上边几个示例,@Async实际还是通过Future或CompletableFuture来异步执行的,Spring又封装了一下,让我们使用的更方便。

关键词:

 

热文推荐

[线程池]Springboot如何使用线程池

在SpringBoot应用中,经常会遇到在一个接口中,同时做事情1,事情2,事情3,如果同步执行的话,则本次接口时间取决于事情123执行时间之和;如果三

2023-03-18

全球观焦点:莽荒纪纪宁小说_莽荒纪纪宁

1、不是,莽荒纪中一直有提醒,纪宁前世只是一个受尽苦难的孩子。2、自从纪宁出生就患上了绝症,活不过15岁,没法上学。3、

2023-03-17

泰拉瑞亚草雉剑合成表_泰拉瑞亚草雉怎么做_快播报

1、毒刺史莱姆丛林地下的矿洞有刷毒刺史莱姆或各种大蜜蜂掉的毒刺15个。2、加上丛林地下的矿洞会发绿光的丛林孢子12个。

2023-03-17

国内商品期货收盘 PTA涨超3%_世界热消息

【国内商品期货收盘PTA涨超3%】财联社3月17日电,国内商品期货收盘,涨跌参半。尿素、PTA涨超3%,短纤涨逾2%,硅铁、锰硅等涨超1%,花生、铁矿

2023-03-17

世界关注:率团交流被扣红帽 邱奕胜:交流总比吵架好

中国国民党桃园市议长邱奕胜日前率领桃园市议会一行共24人到上海参访,期间与上海市委常委、统战部长陈通等官员会面,照片曝光后遭基进党、民

2023-03-17

天天快报!纯真年代电影美国_纯真年代 电影

1、《纯真年代》是由韩荣声自编自导,范洪涛、张琳、黄宝龙、温正邦、古玉枫、王思霖等主演的儿童电影。2、影片讲述了上世纪九

2023-03-17

摩羯是什么象星座_摩羯是什么?-天天快播报

1、传说中,摩羯指的是潘恩改造的半羊半鱼的怪物。2、野山之神潘恩作为牧羊人成为了牧羊人的守护神。他的长相是上半身是人,下

2023-03-17

天天快消息!武汉设立首批行政立法基层联系点

武汉设立首批行政立法基层联系点

2023-03-17

ps做泼墨效果_ps怎么做泼墨效果_天天聚看点

1、1 第1步创建一幅700*1000的画布,之后创建一层,填充白色,给图层加上渐变叠加,色彩为 778989, cb

2023-03-17

汇算清缴怎么做账务处理分录_汇算清缴怎么做 世界新要闻

1、汇算清缴怎么做?一、汇算清缴,企业所得税是按年计征,按季预缴,年度汇算清缴。2、汇算清缴的期限是年后5个月内,这是给

2023-03-16

美媒:“中国奠定了新的里程碑”|每日视讯

参考消息网3月15日报道美国《华盛顿邮报》网站3月12日刊登题为《中国在美国的阴影下担当中东和平的斡旋者》的文章,作者是伊尚·塔鲁尔。文章

2023-03-16

世界热点评!星二代奥莉参加花滑比赛摔倒,明星应该为孩子怎么样铺路?

近日,久未露面的李小鹏女儿奥莉以星二代的身份参加了花滑比赛,小姑娘滑得有模有样却因为摔了一跤而上了热搜。毕竟出身在体育世家,作为明星

2023-03-16

河南最低工资标准2023年多少钱一个月?河南最低工资标准2023是多少-环球热文

2023年河南最低工资多少钱一个月?河南最低工资标准2023还未公布2023年最新最低工资标准还未公布,现整理此前公布的最低工资标准供您参考,下

2023-03-16

环球报道:到底是不是说谎?我老公是上海公安,5套房不是白混的,打人后续

到底是不是说谎?我老公是上海公安,5套房不是白混的,打人后续,说谎,李刚,代驾,草帽姐,上海市,上海公安,当地警方

2023-03-16

一个出一个耳朵旁是什么字_耳朵出脓怎么办

1、如果耳内有脓,首先考虑的是外耳、外耳道或中耳有感染症状。2、外耳道和耳廓可以看到是否有疖、皮脂腺囊肿等感染迹象。3、

2023-03-16

TVB母公司股价继续下挫 股价较近期高点已腰斩

3月16日电,香港本地影视概念港股走低。截至发稿,TVB母公司电视广播(00511 HK)跌13%报8 47港元,该股此

2023-03-16

视焦点讯!小学体育奖状名称大全(小学生奖状名称大全)

小学体育奖状名称大全,小学生奖状名称大全这个很多人还不知道,现在让我们一起来看看吧!1、德育标兵、三好学生、优秀班干部、优秀少先队员、

2023-03-16

3月15日基金净值:广发趋势优选灵活配置混合A最新净值1.6815,涨0.05%_播资讯

3月15日,广发趋势优选灵活配置混合A最新单位净值为1 6815元,累计净值为2 0805元,较前一交易日上涨0 05%。历史数据显示该基金近1个月下跌1 0

2023-03-16

药贩子的套路!免费评书机暗藏天价神药骗局

中央电视台财经频道官网微博消息,在吉林,不少老人一年能收到上百个免费送的包裹,里面装着下载了一条时长在4小时以上音频的收音机,内容为一

2023-03-15

天天热议:海东互助:开展“3.15”现场宣传咨询服务

海东互助:开展“3 15”现场宣传咨询服务

2023-03-15

资讯

北京推出14条秋游文化线路

金秋时节,北京市文化和旅游局以赏银杏品文化为主题,推出14条“叶落的季节——漫步北京赏银杏品文化主题线路”,邀市民和游客以步行、骑行

2021-10-27     
基因编辑发力 培育高质量人源化供体猪

此次人体试验,仅仅验证了基因编辑猪克服异种器官移植的超急性排斥反应,还需解决延迟性排斥反应、消耗性血栓等问题。但通过这次试验,能更

2021-10-27     
中国经济高质量发展步伐稳健 长期向好基本面未变

在全球疫情走势和经济走势趋于复杂的背景下,中国经济巨轮将驶向何方,举世关注。2020年10月26日至29日,党的十九届五中全会在京举行,明确

2021-10-27     
南美解放者杯决赛允许近4.5万观众入场

南美洲足联主席多明格斯25日与今年解放者杯决赛对阵的两支俱乐部负责人会晤,宣布决赛现场观众人数增加到球场容量的75%,即近4 5万人。今年

2021-10-27     
22年从警生涯 面对荣誉他说不要给我报功

9月24日,时任安徽省安庆市公安局迎江分局刑警大队大要案中队中队长周磊因在工作中激烈搏斗引发心源性猝死,倒在了工作岗位上,经医院抢救

2021-10-27     
走近冬奥|五棵松体育中心场馆“黑科技”全面上岗 助力冬

“相约北京”冰球国内测试活动将于2021年11月7日至10日在五棵松体育中心场馆举行,在疫情防控方面,场馆引入了诸多“黑科技”,为防疫安全

2021-10-27