spring boot 异步线程池的使用详解

 更新时间:2026年04月30日 09:17:25   作者:Java知识技术分享  
本文介绍了如何在SpringBoot项目中配置异步线程池,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

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>

3.配置异步线程池参数
在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个,再有新的任务进来当前线程都不是空闲状态则会报错。

4.编写配置类以定义线程池
接下来,你需要编写一个配置类,使用@Configuration注解来定义线程池。在这个配置类中,你将使用@Bean注解来创建一个ThreadPoolTaskExecutor实例,并根据application.properties中的配置来设置线程池的参数。

5.编写配置类以定义线程池
接下来,你需要编写一个配置类,使用@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;
    }
}

6.编写异步任务类
现在,你可以编写一个包含异步方法的类。在这个类中,你将使用@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();
        }
    }
}

7.最后,在你的控制器或其他服务类中,你可以调用这个异步方法来执行异步任务。

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中,并通过依赖注入来调用。

到此这篇关于spring boot 异步线程池的使用的文章就介绍到这了,更多相关spring boot 异步线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring中@Value注解详细图文讲解

    Spring中@Value注解详细图文讲解

    在spring中有两种注入方式一种是XML文件注入,另一种则是注解注入,这篇文章主要给大家介绍了关于Spring中@Value注解的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Spring集成PageHelper的简单用法示例

    Spring集成PageHelper的简单用法示例

    这篇文章主要介绍了Spring集成PageHelper的简单用法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Java Unsafe 类的讲解

    Java Unsafe 类的讲解

    这篇文章主要给大家分享了 Java Unsafe 类的讲解,文章围绕Unsafe 类的相关资料展开详细内容,具有一定的参考价值需要的朋友可以参考一下
    2021-11-11
  • java使用任务架构执行任务调度示例

    java使用任务架构执行任务调度示例

    在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接池的线程池来执行任务,下面看一个示例
    2014-01-01
  • 如何使用stream从List对象中获取某列数据

    如何使用stream从List对象中获取某列数据

    这篇文章主要介绍了如何使用stream从List对象中获取某列数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 解决SpringCloud Feign传对象参数调用失败的问题

    解决SpringCloud Feign传对象参数调用失败的问题

    这篇文章主要介绍了解决SpringCloud Feign传对象参数调用失败的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java对象在JVM中的生命周期详解

    Java对象在JVM中的生命周期详解

    这篇文章主要介绍了Java对象在JVM中的生命周期详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • 详解Java8如何使用Lambda表达式进行比较

    详解Java8如何使用Lambda表达式进行比较

    Lambda表达式,也可称为闭包,是java8的新特性,作用是取代大部分内部类,优化java代码结构,让代码变得更加简洁紧凑。本文将利用Lambda表达式进行排序比较,需要的可以参考一下
    2022-01-01
  • Java AOP面向切面编程的概念和实现方式

    Java AOP面向切面编程的概念和实现方式

    AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍Java AOP面向切面编程的概念和实现方式,感兴趣的朋友一起看看吧
    2025-09-09
  • Spring Boot开发编译后读取不到@spring.profiles.active@的问题及解决步骤

    Spring Boot开发编译后读取不到@spring.profiles.active@的问题及解决步骤

    这篇文章主要介绍了Spring Boot开发编译后读取不到@spring.profiles.active@的问题及解决步骤,需要的朋友可以参考下
    2024-12-12

最新评论