当前位置:首页 > 科技  > 软件

SpringBoot中的异步多线程使用及避坑指南

来源: 责编: 时间:2024-03-28 17:49:57 118观看
导读在现代的Web应用开发中,处理请求时需要考虑到系统的性能和响应速度。特别是在处理大量请求或者需要进行耗时操作时,采用异步多线程处理是一种常见的解决方案。Spring Boot提供了@Async注解来支持异步方法调用,结合合适的

在现代的Web应用开发中,处理请求时需要考虑到系统的性能和响应速度。特别是在处理大量请求或者需要进行耗时操作时,采用异步多线程处理是一种常见的解决方案。Spring Boot提供了@Async注解来支持异步方法调用,结合合适的线程池配置,可以很容易地实现异步多线程处理,提升系统的并发能力和性能。SJl28资讯网——每日最新资讯28at.com

今日内容介绍,大约花费9分钟SJl28资讯网——每日最新资讯28at.com

图片图片SJl28资讯网——每日最新资讯28at.com

1.配置线程池

@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;    }}

SJl28资讯网——每日最新资讯28at.com

在这个配置中,我们使用了ThreadPoolTaskExecutor作为线程池的实现,并且设置了一些关键参数,如核心线程数、最大线程数、缓冲队列大小等。如果不太了解线程池的小伙伴可以看一下之前介绍线程池介绍线程池的核心参数,线程池的执行原理知道SJl28资讯网——每日最新资讯28at.com

2. @Async注解

在需要异步执行的方法上使用@Async注解。这样的方法将会在一个单独的线程中执行,而不会阻塞主线程。SJl28资讯网——每日最新资讯28at.com

@Slf4j@Servicepublic class AsyncService {   // 指定使用beanname为doSomethingExecutor的线程池    @Async("doSomethingExecutor")    public  CompletableFuture<String> doSomething(String message) throws InterruptedException {        log.info("doSomethingExecutor thread name  ={}", Thread.currentThread().getName());        Thread.sleep(1000);        return CompletableFuture.completedFuture(message);    }}

doSomething()方法被标记为异步方法,并且指定了使用名为"doSomethingExecutor"的线程池进行执行。SJl28资讯网——每日最新资讯28at.com

3. 异步多结果聚合返回CompletableFuture

在某些情况下,我们可能需要等待多个异步任务执行完毕后再进行下一步操作,这时可以使用CompletableFuture来实现异步多结果的聚合。SJl28资讯网——每日最新资讯28at.com

@RestController@RequestMappingpublic class AsyncController {    @Autowired    private AsyncService asyncService;    @GetMapping("/open/somethings")    public List<String> somethings() throws InterruptedException {        int count = 6;        List<CompletableFuture<String>> futures = new ArrayList<>();        List<String> results = new ArrayList<>();        // 启动多个异步任务,并将 CompletableFuture 对象存储在列表中        for (int i = 1; i < count; i++) {            CompletableFuture<String> future = asyncService.doSomething("index: "+i);            futures.add(future);        }                for (CompletableFuture<String> future : futures) {            String result = future.get(); // 阻塞等待异步任务完成并获取结果            results.add(result);        }        return results;    }}

我们通过循环启动了多个异步任务,将返回的 CompletableFuture 对象存储在列表中。然后,我们再次循环遍历这些 CompletableFuture 对象,并调用 get() 方法来阻塞等待异步任务完成,获取结果。最后,将结果添加到结果列表中并返回SJl28资讯网——每日最新资讯28at.com

4. 测试

使用浏览器发送http://localhost:8888/open/somethings,结果如下SJl28资讯网——每日最新资讯28at.com

图片图片SJl28资讯网——每日最新资讯28at.com

发现使用多个线程执行方法SJl28资讯网——每日最新资讯28at.com

图片图片SJl28资讯网——每日最新资讯28at.com

5.注意事项

@Async注解会在以下几个场景失效,使用了@Async注解,但就没有走多线程:SJl28资讯网——每日最新资讯28at.com

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

异步方法使用注解@Async的返回值只能为void或者Future及其子类,当返回结果为其他类型时,方法还是会异步执行,但是返回值都是nullSJl28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-80194-0.htmlSpringBoot中的异步多线程使用及避坑指南

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: vivo 消息中间件测试环境项目多版本实践

下一篇: AI时代的技术栈,你了解几分?

标签:
  • 热门焦点
  • vivo TWS Air开箱体验:真轻 臻好听

    vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 一文搞定Java NIO,以及各种奇葩流

    一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • ESG的面子与里子

    ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 重估百度丨大模型,能撑起百度的“今天”吗?

    重估百度丨大模型,能撑起百度的“今天”吗?

    自象限原创 作者|程心 罗辑2023年之前,对于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新业务到 2022 年底还是 0,希望 2023 年出来一个 1。&rdquo;这是2022年底,李彦宏
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • iQOO Neo8系列新品发布会

    iQOO Neo8系列新品发布会

    旗舰双芯 更强更Pro
  • Windows 11发布,微软一改往常对老机型开放的态度

    Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
  • Meta盲目扩张致超万人被裁,重金押注元宇宙而前景未明

    Meta盲目扩张致超万人被裁,重金押注元宇宙而前景未明

    图片来源:图虫创意日前,Meta创始人兼CEO 马克&middot;扎克伯发布公开信,宣布Meta计划裁员超11000人,占其员工总数13%。他公开承认了自己的预判失误:&ldquo;不仅
Top