在Spring Boot中使用@Async异步任务的线程池

news2024/11/24 5:51:08

在读这篇文章之前,我们先回答一个问题,什么是并发,并发和多线程是什么关系?

并发是指系统中存在多个独立的活动(任务、线程等),这些活动在一段时间内交替执行,从而使得多个活动在重叠的时间段内存在。在计算机科学中,通常指的是同时处理多个任务的能力。这些任务可能是同时运行的独立进程、线程或通过时间片轮转的方式交替执行。

多线程是实现并发的一种方式。在一个进程中,可以创建多个线程,每个线程执行一个独立的任务。这些线程共享相同的进程资源,如内存空间,但每个线程有自己的程序计数器、栈和局部变量。多线程使得程序能够同时执行多个任务,提高了系统的资源利用率和响应速度。

并发和多线程之间存在密切关系多线程是一种实现并发的方式,通过同时运行多个线程,可以在同一时间内执行多个任务,从而实现并发。在并发系统中,多线程可以同时处理多个任务,使得系统更加高效、灵活和响应性强。然而,要确保多线程的正确执行,需要注意线程之间的同步、互斥和共享资源的管理,以避免潜在的竞态条件和数据一致性问题。


那么我们来说说,既然有了@Async,我们还需要使用他提供的线程池?

虽然使用@Async注解允许方法异步执行,但它并不提供底层的线程池管理。默认情况下,Spring会使用一个简单的任务执行器来执行异步方法,这可能不是在所有场景下都是理想的。

  1. 自定义线程池配置:使用@Async注解时候,默认情况相爱,我们Spring 使用的是SimpleAsyncTaskExecutor,这个执行器每次都会创建一个新的线程来执行任务,这也可能并非在我们所有的情况下都是最佳的选择,我们可以通过@Async提供的线程池,可以通过配置线程池的大小,队列容量,线程命名等,可以满足我们的应用程序的需求。
  2. 线程池的管理和监控: @Async提供的线程池是一个ThreadPoolTaskExecutor,它是TaskExecutor接口的实现。这使得可以更容易地与Spring的其他任务调度和执行功能进行集成,例如与@Scheduled注解一起使用。此外,Spring提供了对线程池的监控和管理的支持,你可以在Spring的JMX(Java Management Extensions)中监视和管理线程池的运行状况。
  3. 任务拒绝策略: 通过使用@Async提供的线程池,你可以配置任务拒绝策略来处理在线程池已满时提交的任务。这允许你在高负载情况下更好地控制任务的流量,防止系统过载。
  4. 更好的性能和资源利用: 通过使用合适配置的线程池,可以更好地控制线程的数量,防止系统过度消耗资源。线程池的管理机制可以有效地重用线程,减少线程创建和销毁的开销。

接下来我们来看一下一个案例:


配置一个线程池,以控制异步任务的执行。在你的Spring Boot应用程序的配置类中,添加@Bean注解的方法,返回TaskExecutor类型的bean。

@Configuration
@EnableAsync
public class AsyncConfig {

    @Bean(name = "asyncExecutor")
    public TaskExecutor asyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5); // 设置核心线程池大小
        executor.setMaxPoolSize(10); // 设置最大线程池大小
        executor.setQueueCapacity(100); // 设置队列容量
        executor.setThreadNamePrefix("AsyncThread-"); // 设置线程名前缀
        executor.initialize();
        return executor;
    }
}

创建一个Service类:

@Service
public class AnotherService {

    private final MyAsyncService myAsyncService;

    @Autowired
    public AnotherService(MyAsyncService myAsyncService) {
        this.myAsyncService = myAsyncService;
    }

    public void performAsyncTask() {
        myAsyncService.asyncMethod();
        myAsyncService.asyncMethod();
        myAsyncService.asyncMethod();
        myAsyncService.asyncMethod();
        myAsyncService.asyncMethod();
        // 其他逻辑
    }
}

在上边asyncExecutor方法返回一个ThreadPoolTaskExecutor实例。


服务类或组件中,使用@Async注解标记异步方法

@Service
public class MyAsyncService {

    @Async
    public void asyncMethod() {
        // 异步任务的实现
        System.out.println("Async method executed by thread: " + Thread.currentThread().getName());
    }
}

之后我们创建一个单元测试来测试一下:

@Slf4j
@SpringBootTest
public class ApplicationTests {



    @Autowired
    private AnotherService anotherService;

    @Test
    public void test1() throws Exception {
        anotherService.performAsyncTask();
    }

}

在这里插入图片描述

看一下Anysc的相关参数
在这里插入图片描述

有关于参数,我这里进行详细介绍一下:

	private final Object poolSizeMonitor = new Object();
    private int corePoolSize = 1;
    private int maxPoolSize = Integer.MAX_VALUE;
    private int keepAliveSeconds = 60;
    private int queueCapacity = Integer.MAX_VALUE;
    private boolean allowCoreThreadTimeOut = false;
    @Nullable
    private TaskDecorator taskDecorator;
    @Nullable
    private ThreadPoolExecutor threadPoolExecutor;
    private final Map<Runnable, Object> decoratedTaskMap;

poolSizeMonitor

类型:Object
说明:这是一个监视线程池大小的对象。在代码中,使用 synchronized 块来确保对线程池大小的修改是线程安全的。

corePoolSize

类型:int
默认值:1
说明:核心线程池大小,即线程池中保持存活的线程数量。这些线程在没有任务执行时仍然存活,减少了线程的创建和销毁开销。

maxPoolSize

类型:int
默认值:Integer.MAX_VALUE
说明:线程池中允许的最大线程数。当核心线程都在忙于执行任务且队列已满时,新任务将创建额外线程,但数量不超过 maxPoolSize。

keepAliveSeconds

类型:int
默认值:60
说明:非核心线程的闲置时间超过此值时,线程将被终止。这有助于控制线程池的大小,避免过多的线程资源占用。

queueCapacity

类型:int
默认值:Integer.MAX_VALUE
说明:任务队列的容量,用于保存等待执行的任务。当所有核心线程都在忙于执行任务时,新任务将被放入队列中等待。

allowCoreThreadTimeOut

类型:boolean
默认值:false
说明:确定核心线程是否也可以因为闲置超时而被终止。如果设置为true,即使核心线程在执行任务之后处于空闲状态,它们也可能被终止。

taskDecorator

类型:TaskDecorator
默认值:null
说明:任务装饰器,用于在将任务提交到线程池之前修改任务的行为。可以用于记录任务执行时间、添加上下文信息等。

threadPoolExecutor

类型:ThreadPoolExecutor
说明:实际的 ThreadPoolExecutor 实例。在运行时,这个字段可能会被初始化为ThreadPoolExecutor 的实例,用于执行异步任务。

decoratedTaskMap

类型:Map<Runnable, Object>
说明:装饰过的任务的映射。这可能用于跟踪已提交的任务及其状态。

我们可以利用以上的参数配置我们的@Async异步参数。根据你自己的情况进行选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1258789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++:由哈希延伸出来的应用--位图和布隆过滤器

文章目录 位图的概念位图的实现布隆过滤器布隆过滤器的查找布隆过滤器的删除布隆过滤器的优点 布隆过滤器的实现 本篇实现的是位图和应用 位图的概念 下面有这样的场景&#xff1a;给定40亿个数&#xff0c;现在要找这当中的一个数&#xff0c;如何寻找&#xff1f; 遍历&am…

box-sizing属性,IE怪异盒模型

有没有遇到过这种情况&#xff1f; 当一个放在整个页面的容器&#xff0c;它的宽度定义为 width:100%; 之后。假设再添加 padding &#xff0c;border 或者 margin 则会溢出父容器&#xff0c;是向外扩张的&#xff0c;也就是说设置了之后看不到效果。 首先看盒模型&#xf…

linux下的工具---yum

一、什么是yum yum是Linux下的软件包管理器 二、什么是软件包管理器 1、在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 2、但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在…

【实战教程】PHP与七牛云的完美对接,你值得拥有!

前言&#xff1a; 随着互联网的迅速发展&#xff0c;越来越多的网站和应用程序需要处理大量的图片、视频和其他文件。为了有效地存储和管理这些文件&#xff0c;并提供快速的内容分发服务&#xff0c;开发者们常常依赖于云存储和CDN服务提供商。 七牛云是一家领先的云存储和C…

如何使用技术SEO来优化产品轮播

SEO&#xff08;搜索引擎优化&#xff09;对你来说并不陌生。现代电子商务系统通常包含旨在吸引谷歌等搜索引擎机器人注意的关键字。 但是&#xff0c;技术 SEO 在代码和服务器级别调查电子商务 SEO 策略。它改善了网站的技术因素&#xff0c;例如页面加载的速度以及抓取的直接…

可移动框 弹窗 可拖拽的组件

电脑端: <template><divv-if"show"ref"infoBox"mousedown.stop"mouseDownHandler"class"info-box":style"styleObject"><slot></slot></div> </template> <script> export defa…

Spring 中存储 Bean 的相关注解

Bean的存 IoC控制反转&#xff0c;就是将对象的控制权交给Spring的IOC容器&#xff0c;由IOC容器创建及管理对象。 也就是bean的存储 类注解:五大注解 Controller&#xff08;控制器存储&#xff09; Service&#xff08;服务存储&#xff09; Component&#xff08;组件存储…

Spring第二课响应的完全,如何理解前后端互联

目录 一、响应 Control,RestController 1.Controller的源码&#xff0c;代表什么意思 2.返回数据 Responsebody 3.返回HTML片段 4.返回JSON 5.那么假如我们使用集合会怎么样呢 设置状态码&#xff0c;虽然不影响展示&#xff0c;但是确实显示起来也就是401的情况。 2.我…

ECShop 4.x collection_listSQL注入

漏洞描述 ECShop是一款B2C独立网店系统&#xff0c;适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序 影响版本&#xff1a;ecshop4.0.7及以下 漏洞环境及利用 docker环境搭建 访问8080端口&#xff0c;数据库主机为mysql&a…

Spark---Master启动及Submit任务提交

一、Spark Master启动 1、Spark资源任务调度对象关系图 2、集群启动过程 Spark集群启动之后&#xff0c;首先调用$SPARK_HOME/sbin/start-all.sh&#xff0c;start-all.sh脚本中调用了“start-master.sh”脚本和“start-slaves.sh”脚本&#xff0c;在start-master.sh脚本中可…

LLM之Agent(二):BabyAGI的详细教程

BabyAGI是一个 AI 支持的任务管理系统&#xff08;Python脚本&#xff09;&#xff0c;使用 OpenAI 和 Pinecone API 创建, 优先级排序和执行任务。该系统背后的主要思想是基于先前任务的结果和预定义的目标创建任务。脚本然后使用 OpenAI 的自然语言处理&#xff08;NLP&#…

文献速递:超声影像人工智能专题文献分享

文献速递&#xff1a;超声影像人工智能专题文献分享 01 文献速递介绍 本文综述了超声影像组学在甲状腺疾病研究中的应用及其局限性。近年来&#xff0c;甲状腺疾病的发病率逐渐增加&#xff0c;传统超声是最关键的甲状腺成像方法之一&#xff0c;但仍存在一定局限性。超声影…

Syncovery Mac/win中文版:快速、方便的数据备份和同步工具

备份和同步数据是现代生活中不可或缺的任务。无论是个人用户还是企业用户&#xff0c;都需要一款可靠的工具来保护和同步他们的数据。Syncovery是一款备份数据和同步工具&#xff0c;它能够提供全面的数据保护和灵活的数据同步功能。 首先&#xff0c;Syncovery具有强大的备份…

每日一练:简易计算器

1.设计思路 创建一个简单的用户界面&#xff0c;可以使用 Python 的 Tkinter模块。在界面上放置按钮&#xff0c;每个按钮代表一个数字、运算符或其他功能。使用变量来追踪用户输入的表达式。在用户点击按钮时&#xff0c;更新表达式并在界面上显示。 当用户点击“”按钮时&am…

window关于下载anaconda 2023年以后的版本,jupyter notebook闪退,没有内核的问题

这种问题的解决办法&#xff1a; 下载anaconda较早版本&#xff0c;比如我下载的是&#xff1a;2022年5月的版本。 下载之后&#xff0c;打开jupyter好像也会没有内核和闪退。 下面解决步骤&#xff1a; 1.注意&#xff1a;打开anaconda powershell prompt 2.重点来了&#xf…

漏洞复现--致远 M3 反序列化 mobile_portal RCE

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

Uni-app智慧工地可视化信息云平台源码

智慧工地的核心是数字化&#xff0c;它通过传感器、监控设备、智能终端等技术手段&#xff0c;实现对工地各个环节的实时数据采集和传输&#xff0c;如环境温度、湿度、噪音等数据信息&#xff0c;将数据汇集到云端进行处理和分析&#xff0c;生成各种报表、图表和预警信息&…

支持向量机:Python实践

支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;是机器学习领域中一种常用的分类算法&#xff0c;其在处理线性可分和线性不可分问题上表现出色。Python作为一种广泛应用的编程语言&#xff0c;提供了众多强大的机器学习库和工具&#xff0c;使得…

Mysql数据库多表数据查询问题

1、背景 线上某个业务数据分表存储在10个子表中&#xff0c;现在需要快速按照条件&#xff08;比如时间范围&#xff09;筛选出所有的数据&#xff0c;主要是想做一个可视化的数据查询工具&#xff0c;给产研团队使用。 2、实践 注意&#xff1a;不要在线上真实数据库操作&am…

【JavaEE初阶】 博客系统项目--前端页面设计实现

文章目录 &#x1f332;主要内容&#x1f38d;预期效果&#x1f6a9;博客列表页效果&#x1f6a9;博客详情页&#x1f6a9;博客登录页&#x1f6a9;博客编辑页 &#x1f340;实现博客列表页&#x1f6a9;实现导航栏&#x1f388;页面主体部分 &#x1f384;实现博客详情页&…