Spring Boot使用线程池创建多线程的完整示例

 更新时间:2025年03月18日 10:46:38   作者:翱翔-蓝天  
在 Spring Boot 2 中,可以使用 @Autowired 注入 线程池(ThreadPoolTaskExecutor 或 ExecutorService),从而管理线程的创建和执行,以下是使用 @Autowired 方式注入线程池的完整示例,感兴趣的朋友一起看看吧

在 Spring Boot 2 中,可以使用 @Autowired 注入 线程池(ThreadPoolTaskExecutorExecutorService),从而管理线程的创建和执行。以下是使用 @Autowired 方式注入线程池的完整示例。

1. 通过 @Autowired 注入 ThreadPoolTaskExecutor

步骤 1:配置线程池

创建 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 = "customTaskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);  // 核心线程数
        executor.setMaxPoolSize(10);  // 最大线程数
        executor.setQueueCapacity(25); // 任务队列容量
        executor.setThreadNamePrefix("Async-Executor-"); // 线程名前缀
        executor.initialize();
        return executor;
    }
}

步骤 2:使用 @Autowired 注入线程池

Service 层,通过 @Autowired 注入 ThreadPoolTaskExecutor 并执行任务:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import java.util.concurrent.Future;
@Service
public class AsyncTaskService {
    private static final Logger logger = LoggerFactory.getLogger(AsyncTaskService.class);
      @Autowired
    @Qualifier("customTaskExecutor") // 通过 @Qualifier 指定 Bean 名称
    private ThreadPoolTaskExecutor customTaskExecutor;
    // 提交异步任务
    public void runAsyncTask() {
        customTaskExecutor.execute(() -> {
            logger.info("异步任务执行,线程名:{}", Thread.currentThread().getName());
            try {
                Thread.sleep(2000); // 模拟耗时任务
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            logger.info("异步任务完成,线程名:{}", Thread.currentThread().getName());
        });
    }
    // 提交带返回值的异步任务
    public Future<String> runAsyncTaskWithResult() {
        return customTaskExecutor.submit(() -> {
            logger.info("执行带返回值的异步任务,线程名:{}", Thread.currentThread().getName());
            Thread.sleep(2000);
            return "任务完成";
        });
    }
}

步骤 3:在 Controller 中调用

Controller 层,通过 @Autowired 调用 AsyncTaskService

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.Future;
@RestController
@RequestMapping("/task")
public class AsyncTaskController {
    @Autowired
    private AsyncTaskService asyncTaskService;
    @GetMapping("/run")
    public String runTask() {
        asyncTaskService.runAsyncTask();
        return "任务已提交";
    }
    @GetMapping("/runWithResult")
    public String runTaskWithResult() throws Exception {
        Future<String> result = asyncTaskService.runAsyncTaskWithResult();
        return "任务结果:" + result.get();
    }
}

2. 通过 @Autowired 注入 ThreadPoolTaskScheduler(适用于定时任务)

步骤 1:配置 ThreadPoolTaskScheduler

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@Configuration
public class TaskSchedulerConfig {
    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(5);  // 线程池大小
        scheduler.setThreadNamePrefix("Scheduled-Task-");
        scheduler.initialize();
        return scheduler;
    }
}

步骤 2:在 Service 中使用 @Autowired注入

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Service;
import java.util.concurrent.ScheduledFuture;
@Service
public class ScheduledTaskService {
    private static final Logger logger = LoggerFactory.getLogger(ScheduledTaskService.class);
    @Autowired
    private ThreadPoolTaskScheduler taskScheduler;
    public void scheduleTask() {
        ScheduledFuture<?> future = taskScheduler.scheduleAtFixedRate(() -> {
            logger.info("执行定时任务,线程名:{}", Thread.currentThread().getName());
        }, 5000);
    }
}

步骤 3:在 Controller 中调用

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/schedule")
public class ScheduleTaskController {
    @Autowired
    private ScheduledTaskService scheduledTaskService;
    @GetMapping("/start")
    public String startScheduledTask() {
        scheduledTaskService.scheduleTask();
        return "定时任务已启动";
    }
}

3. 通过 @Autowired 注入 ExecutorService

如果你更喜欢 Java 原生的 ExecutorService,可以使用 @Bean 配置:

步骤 1:定义 ExecutorService 线程池

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Configuration
public class ExecutorServiceConfig {
    @Bean
    public ExecutorService fixedThreadPool() {
        return Executors.newFixedThreadPool(5);
    }
}

步骤 2:在 Service 中注入 ExecutorService

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.concurrent.ExecutorService;
@Service
public class ExecutorServiceTask {
    private static final Logger logger = LoggerFactory.getLogger(ExecutorServiceTask.class);
    @Autowired
    private ExecutorService executorService;
    public void executeTask() {
        executorService.execute(() -> {
            logger.info("执行任务,线程名:{}", Thread.currentThread().getName());
        });
    }
}

步骤 3:在 Controller 中调用

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/executor")
public class ExecutorServiceController {
    @Autowired
    private ExecutorServiceTask executorServiceTask;
    @GetMapping("/run")
    public String runTask() {
        executorServiceTask.executeTask();
        return "任务已提交";
    }
}

总结

方式适用场景配置方式
ThreadPoolTaskExecutor普通异步任务 (@Asyncexecute)@Autowired private ThreadPoolTaskExecutor
ThreadPoolTaskScheduler定时任务@Autowired private ThreadPoolTaskScheduler
ExecutorService原生 Java 线程池@Autowired private ExecutorService

推荐方式

  • 使用 ThreadPoolTaskExecutor 结合 @Autowired 来管理异步任务(推荐)。
  • 使用 ThreadPoolTaskScheduler 进行定时任务调度。
  • 避免直接使用 ExecutorService,因为它不受 Spring 管理,不能动态调整线程池参数。

这样可以 充分利用 Spring Boot 线程池管理,提高系统性能,减少资源消耗,并且代码更易维护! 🚀

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

相关文章

  • Java发送https请求代码实例

    Java发送https请求代码实例

    这篇文章主要介绍了Java发送https请求代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • java字符串比较获取字符串出现次数的示例

    java字符串比较获取字符串出现次数的示例

    java获取一个字符串在整个字符串出现的次数,下面写出我的思路和二个实现方法,大家参考使用吧
    2014-01-01
  • SpringBoot如何使用内嵌Tomcat问题

    SpringBoot如何使用内嵌Tomcat问题

    这篇文章主要介绍了SpringBoot如何使用内嵌Tomcat问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java编程实现二项分布的采样或抽样实例代码

    Java编程实现二项分布的采样或抽样实例代码

    这篇文章主要介绍了Java编程实现二项分布的采样或抽样实例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java多线程深入理解

    Java多线程深入理解

    这篇文章主要介绍了java多线程编程实例,分享了几则多线程的实例代码,具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下
    2021-07-07
  • Java Swing中的JButton、JComboBox、JList和JColorChooser组件使用案例

    Java Swing中的JButton、JComboBox、JList和JColorChooser组件使用案例

    这篇文章主要介绍了Java Swing中的按钮(JButton)、组合框(JComboBox)、下拉列表(JList)和颜色选择器(JColorChooser)组件使用案例,需要的朋友可以参考下
    2014-10-10
  • idea项目报错缺失maven依赖问题及解决

    idea项目报错缺失maven依赖问题及解决

    这篇文章主要介绍了idea项目报错缺失maven依赖问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • 浅谈maven的jar包和war包区别 以及打包方法

    浅谈maven的jar包和war包区别 以及打包方法

    下面小编就为大家分享一篇浅谈maven的jar包和war包区别 以及打包方法,具有很好的参考价值,希望对大家有所帮助
    2017-11-11
  • Java设计模式之抽象工厂模式浅析讲解

    Java设计模式之抽象工厂模式浅析讲解

    当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式,抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态
    2022-08-08
  • 浅谈Java程序运行机制及错误分析

    浅谈Java程序运行机制及错误分析

    这篇文章主要主要介绍了Java虚拟机(JVM)的有关内容以及Java程序的运行机制和错误分析,需要的朋友可以了解下。
    2017-09-09

最新评论