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

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=5
async.executor.thread.max_pool_size=10
async.executor.thread.queue_capacity=25
async.executor.thread.name.prefix=async-
async.executor.thread.keep_alive_seconds=60
async.executor.thread.await_termination_seconds=60

  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 {

    @Autowired
    private 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.kler.cn/a/460874.html

相关文章:

  • 基于Matlab的变压器仿真模型建模方法(12):单相降压自耦变压器的等效电路和仿真模型
  • C# 服务应用研究
  • 《探寻真正开源的大模型:开启AI创新新纪元》
  • 计算机网络原理(一)
  • 【网络安全 | 漏洞挖掘】硬编码凭据泄露实现支付系统账户接管
  • 《机器学习》从入门到实战——逻辑回归
  • [2025 测试] 如何关闭 IPhone 丢失模式
  • C#Halcon图像处理畸变校正之曲面校正
  • 短视频生活服务商是干什么的?本地生活服务系统源码部署是什么意思?靠谱吗?
  • MySQL Workbench安装教程以及菜单汉化
  • 查询docker overlay2文件夹下的 c7ffc13c49xxx是哪一个容器使用的
  • 1、CC2530、zigbee期末考试选择、填空题含答案
  • Python自学 - 引用与拷贝探索(防坑关键知识)
  • Spring-Mybatis 2.0
  • 【C语言】可移植性陷阱与缺陷(一):应对C语言标准变更
  • 单元测试3.0+ @RunWith(JMockit.class)+mock+Expectations
  • PyTorch快速入门教程【小土堆】之网络模型的保存和读取
  • MAC系统QT Creator的快捷键
  • 运维人员的Python详细学习路线
  • JVM之Class文件详解
  • 【前端】Node.js使用教程
  • 《Vue进阶教程》第三十一课:ref的初步实现
  • 2025元旦源码免费送
  • 探索数据之美,Plotly引领可视化新风尚
  • 代码随想录算法训练营DAY17
  • Rust日志库tklog0.2.9—支持混合时间文件大小备份模式