欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > spring默认线程池SimpleAsyncTaskExecutor特点为什么要尽量避免使用

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

2025/2/6 6:43:10 来源:https://blog.csdn.net/zfj321/article/details/144833933  浏览:    关键词: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());}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com