找回密码
 立即注册
首页 业界区 安全 【线程池】SpringBoot 中使用线程池的示例 ...

【线程池】SpringBoot 中使用线程池的示例

林鱼 2025-9-24 16:47:25
Spring Boot 中使用线程池的示例

在 Spring Boot 应用中,线程池常用于处理异步任务、提高并发性能或执行耗时操作而不阻塞主线程。下面是一个完整的示例:
1. 配置线程池

首先,在配置类中定义线程池:
  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.scheduling.annotation.EnableAsync;
  4. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  5. import java.util.concurrent.Executor;
  6. @Configuration
  7. @EnableAsync
  8. public class AsyncConfig {
  9.    
  10.     @Bean(name = "taskExecutor")
  11.     public Executor taskExecutor() {
  12.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  13.         executor.setCorePoolSize(5);    // 核心线程数
  14.         executor.setMaxPoolSize(10);     // 最大线程数
  15.         executor.setQueueCapacity(100);  // 队列容量
  16.         executor.setThreadNamePrefix("Async-Thread-"); // 线程名前缀
  17.         executor.initialize();
  18.         return executor;
  19.     }
  20. }
复制代码
2. 创建异步服务

创建一个使用线程池的服务:
  1. import org.springframework.scheduling.annotation.Async;
  2. import org.springframework.stereotype.Service;
  3. @Service
  4. public class EmailService {
  5.     // 使用指定线程池执行
  6.     @Async("taskExecutor")
  7.     public void sendEmail(String to, String content) {
  8.         // 模拟耗时操作
  9.         try {
  10.             System.out.println(Thread.currentThread().getName() + " 开始发送邮件给: " + to);
  11.             Thread.sleep(2000); // 模拟发送邮件耗时
  12.             System.out.println("邮件发送成功: " + content);
  13.         } catch (InterruptedException e) {
  14.             Thread.currentThread().interrupt();
  15.             System.out.println("邮件发送被中断");
  16.         }
  17.     }
  18. }
复制代码
3. 控制器调用

创建一个控制器来触发异步任务:
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. public class EmailController {
  6.     @Autowired
  7.     private EmailService emailService;
  8.     @GetMapping("/send")
  9.     public String sendEmails() {
  10.         for (int i = 0; i < 10; i++) {
  11.             emailService.sendEmail("user" + i + "@example.com", "测试邮件内容 " + i);
  12.         }
  13.         return "邮件发送请求已提交";
  14.     }
  15. }
复制代码
4. 实际应用场景

这个例子展示了线程池在以下场景中的应用:

  • 批量发送邮件/短信:避免阻塞主线程,提高响应速度
  • 日志记录:异步记录日志不影响主业务流程
  • 数据导出:耗时的Excel导出操作
  • 第三方API调用:异步调用外部服务
  • 定时任务:使用 @Scheduled 注解配合线程池执行定时任务
5. 其他线程池使用方式

除了 @Async 注解,还可以直接使用线程池:
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  3. import org.springframework.stereotype.Service;
  4. @Service
  5. public class ReportService {
  6.    
  7.     @Autowired
  8.     private ThreadPoolTaskExecutor taskExecutor;
  9.    
  10.     public void generateReports() {
  11.         for (int i = 0; i < 20; i++) {
  12.             final int reportId = i;
  13.             taskExecutor.execute(() -> {
  14.                 System.out.println(Thread.currentThread().getName() + " 生成报表: " + reportId);
  15.                 // 模拟报表生成
  16.                 try {
  17.                     Thread.sleep(1000);
  18.                 } catch (InterruptedException e) {
  19.                     Thread.currentThread().interrupt();
  20.                 }
  21.             });
  22.         }
  23.     }
  24. }
复制代码
这个示例展示了如何在 Spring Boot 应用中配置和使用线程池来处理异步任务,提高应用性能。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册