当前位置: 首页 > news >正文

spring boot 异步线程池的使用

  1. 创建Spring Boot项目
    首先,你需要创建一个Spring Boot项目。你可以使用Spring Initializr(https://start.spring.io/)来快速生成项目结构。

  2. 添加异步支持依赖
    在你的pom.xml文件中,确保你已经添加了Spring Boot的starter依赖,特别是spring-boot-starter-web,这将提供异步支持所需的依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
  1. 配置异步线程池参数
    在Spring Boot中,你可以通过application.properties或application.yml文件来配置异步线程池的参数。以下是一个使用application.properties文件的示例:
# 异步线程池配置
async.executor.thread.core_pool_size=2
async.executor.thread.max_pool_size=10
async.executor.thread.queue_capacity=100
async.executor.thread.name.prefix=async-
async.executor.thread.keep_alive_seconds=60
async.executor.thread.await_termination_seconds=60

项目启动的时候线程池里面初始化两个线程,当两个线程都被占用了,又有新的任务进来先进入队列排队,达到队列的最大容量100,就会创建一个新的线程,只到达到最大数量10个,再有新的任务进来当前线程都不是空闲状态则会报错。

  1. 编写配置类以定义线程池
    接下来,你需要编写一个配置类,使用@Configuration注解来定义线程池。在这个配置类中,你将使用@Bean注解来创建一个ThreadPoolTaskExecutor实例,并根据application.properties中的配置来设置线程池的参数。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration
@EnableAsync
public class AsyncConfig {@Value("${async.executor.thread.core_pool_size}")private int corePoolSize;@Value("${async.executor.thread.max_pool_size}")private int maxPoolSize;@Value("${async.executor.thread.queue_capacity}")private int queueCapacity;@Value("${async.executor.thread.name.prefix}")private String namePrefix;@Value("${async.executor.thread.keep_alive_seconds}")private int keepAliveSeconds;@Value("${async.executor.thread.await_termination_seconds}")private int awaitTerminationSeconds;@Bean(name = "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();// 设置核心线程数executor.setCorePoolSize(corePoolSize);// 设置最大线程数executor.setMaxPoolSize(maxPoolSize);// 设置队列容量executor.setQueueCapacity(queueCapacity);// 设置线程名称前缀executor.setThreadNamePrefix(namePrefix);// 线程空闲时的存活时间executor.setKeepAliveSeconds(keepAliveSeconds);// 关闭线程池等待任务完成的最长时间executor.setAwaitTerminationSeconds(awaitTerminationSeconds);// 关闭线程池等待已提交线程执行完毕executor.setWaitForTasksToCompleteOnShutdown(true);// 异常策略executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;}
}
  1. 编写异步任务类
    现在,你可以编写一个包含异步方法的类。在这个类中,你将使用@Async注解来标记需要异步执行的方法,并指定前面定义的线程池(在这个例子中是taskExecutor)。
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;@Service
public class AsyncService {// 在需要使用异步处理的方法上添加注解@Async("taskExecutor")public void executeAsyncTask() {System.out.println("执行异步任务 - " + Thread.currentThread().getName());try {// 模拟长时间运行的任务Thread.sleep(5000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}
}
  1. 最后,在你的控制器或其他服务类中,你可以调用这个异步方法来执行异步任务。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class AsyncController {@Autowiredprivate AsyncService asyncService;@GetMapping("/async")public String handleAsyncRequest() {asyncService.executeAsyncTask();return "异步任务已启动";}
}

通过以上步骤,你就成功地在Spring Boot中配置了异步线程池,并编写了一个异步任务类来演示如何使用它。这样,你就可以在需要时轻松地将任务交给线程池异步执行了。

注意:
@Async注解不生效
‌从Spring容器管理的bean中调用‌:@Async注解的方法必须是从Spring容器管理的bean中调用的。如果从一个非Spring管理的类中调用,那么异步效果将不会生效。
‌自调用问题‌:同一个类中的方法调用不会被Spring的AOP代理捕获,因此如果在一个类中调用同一个类的另一个@Async方法,那么异步效果也不会生效。为了避免这个问题,可以将异步方法移动到另一个bean中,并通过依赖注入来调用。


http://www.mrgr.cn/news/82223.html

相关文章:

  • 【HUAWEI】HCIP-AI-MindSpore Developer V1.0 | 第一章 神经网络基础( 3 循环神经网络 ) | 学习笔记
  • Win32汇编学习笔记03.RadAsm和补丁
  • 讯方订单班介绍
  • 【车载网络】BUSOFF状态简述和制造
  • ModelScope ms-swift:轻量级模型微调框架
  • Java强引用、软引用、弱引用、虚引用的区别?
  • SpringCloud源码分析-Lettue Redis
  • shell脚本的【算数运算、分支结构、test表达式】
  • 03-类和对象(上)
  • SQL偏移类窗口函数—— LAG()、LEAD()用法详解
  • 单片机-蜂鸣器实验
  • vue视频录制 限制大小,限制时长
  • 思科无线控制器 AC5508 初始化
  • 操作系统课后题总复习
  • SpringCloud源码-Ribbon
  • Docker Compose编排
  • spring boot通过文件配置yaml里面的属性
  • Spring实现Logback日志模板设置动态参数
  • 19712 数字接龙
  • TTL 传输中过期问题定位
  • FOC控制原理7-源码解析2-系统滴答定时器中断
  • 使用ebooklib制作符合epub3规范的epub文件
  • C++语言编程————C++数据类型
  • 解决virtualbox克隆ubuntu虚拟机之后IP重复的问题
  • java Redisson 实现限流每秒/分钟/小时限制N个
  • 【复刻】ESG表现对企业价值的影响机制研究(2009-2021年)