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

spring默认线程池SimpleAsyncTaskExecutor特点为什么要尽量避免使用

在 Spring Boot 中,默认的线程池配置由 TaskExecutionAutoConfiguration 类提供,使用的是 SimpleAsyncTaskExecutor

SimpleAsyncTaskExecutor特点

  1. 每次调用创建新线程

    SimpleAsyncTaskExecutor 每次执行任务时都会创建一个新线程,不会重用线程。这使得它非常简单,但在高并发情况下可能会导致大量的线程被创建。
  2. 线程命名

    可以通过 setThreadNamePrefix 方法设置线程名前缀,这对调试和监控有帮助。
  3. 无需线程池

    不像 ThreadPoolTaskExecutorSimpleAsyncTaskExecutor 不使用线程池管理线程。
  4. 并发控制

    没有队列、没有核心线程数或最大线程数的限制。当需要创建的线程数量大于并发数时,会等待,等待有任务结束,才创建新线程。如果我们不设置并发数量,那么每次就会直接创建新线程(无限创建)。

使用场景

由于 SimpleAsyncTaskExecutor 的简单性,它适用于以下场景:

开发和测试

在开发和测试环境中快速验证异步任务的执行,而不需要复杂的线程池配置。

  1. 低并发任务

    适用于任务数量较少、执行频率较低的场景。
  2. 临时任务

    适用于临时的、一次性的任务。

注意事项

使用 SimpleAsyncTaskExecutor 时需要注意以下几点:

  1. 高并发性能问题

    由于每次任务都会创建一个新线程,这可能会导致大量线程被创建,增加资源开销。因此,不适合高并发场景。
  2. 线程管理

    由于没有线程池管理,线程的创建和销毁开销较大,可能导致性能问题。
  3. 内存消耗

    大量创建新线程可能会导致内存消耗过大,需谨慎使用。
  4. 线程命名

    为了便于调试和监控,建议设置线程名前缀。

结论:

实际项目中我们应该尽量避免使用SimpleAsyncTaskExecutor,使用其他真正的线程池,比如jdk 的 ThreadPoolTaskExecutor 

创建一个配置类来定义 ThreadPoolTaskExecutor bean。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

@Configuration
public class ThreadPoolConfig {

    @Bean(name = "taskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);  // 核心线程数
        executor.setMaxPoolSize(10);  // 最大线程数
        executor.setQueueCapacity(25);  // 队列容量
        executor.setThreadNamePrefix("MyExecutor-");  // 线程名前缀
        executor.initialize();
        return executor;
    }
}

在你的主应用类或任意配置类上启用异步支持。 

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableAsync
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

在需要使用异步任务的服务类中,通过 @Async 注解使用配置好的线程池。

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Async("taskExecutor")
    public void asyncMethod() {
        System.out.println("Execute method asynchronously - " + Thread.currentThread().getName());
        // 模拟长时间任务
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Async method completed - " + Thread.currentThread().getName());
    }
}


http://www.kler.cn/a/467044.html

相关文章:

  • AWS DMS基础知识
  • 【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 3:算法实现
  • Jetpack Compose 学习笔记(四)—— CompositionLocal 与主题
  • jQuery get 方法内操控vue变量(异步ajax请求方法中操控双向绑定的响应式变量)实现异步请求函数内完成变量的双向响应式绑定
  • edeg插件/扩展推荐:助力生活工作
  • 基于Web的足球青训俱乐部管理后台系统的设计与开发源码(springboot+mysql+vue)
  • Java四大常用JSON解析性能对比:Hutool、Fastjson2、Gson与Jackson测试
  • Nginx:日志管理
  • 零基础WPF使用NLog记录日志
  • CPU与GPU的区别
  • C/C++中 <<与<<=的介绍和区别
  • Ungoogled Chromium127 编译指南 MacOS 篇(一)- 项目介绍
  • 【Leetcode 热题 100】74. 搜索二维矩阵
  • 【2025最新计算机毕业设计】基于Spring Boot+Vue影院购票系统(高质量源码,提供文档,免费部署到本地)
  • Python 开发框架搭建简单博客系统:代码实践与应用
  • Edge安装问题,安装后出现:Could not find Edge installation
  • 30分钟学会css
  • 电商Google广告:2025年提升转化率的5种策略
  • 八字算命网站搭建方法:从零开始用php搭建一个命理网
  • 才气小波与第一性原理
  • [gcc]常见编译开关
  • 使用GitLab+Jenkins搭建CICD执行环境
  • 滴滴工作流引擎Turbo与logicFlow研究
  • 嵌入式ARM平台 openwrt系统下 基于FFmpeg 的视频采集及推流 实践
  • TypeScript 快速入门指南
  • Java.函数-acwing