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

Spring Boot 中使用线程池的示例

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

1. 配置线程池

首先,在配置类中定义线程池:

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

2. 创建异步服务

创建一个使用线程池的服务:

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

@Service
public class EmailService {

    // 使用指定线程池执行
    @Async("taskExecutor")
    public void sendEmail(String to, String content) {
        // 模拟耗时操作
        try {
            System.out.println(Thread.currentThread().getName() + " 开始发送邮件给: " + to);
            Thread.sleep(2000); // 模拟发送邮件耗时
            System.out.println("邮件发送成功: " + content);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.out.println("邮件发送被中断");
        }
    }
}

3. 控制器调用

创建一个控制器来触发异步任务:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EmailController {

    @Autowired
    private EmailService emailService;

    @GetMapping("/send")
    public String sendEmails() {
        for (int i = 0; i < 10; i++) {
            emailService.sendEmail("user" + i + "@example.com", "测试邮件内容 " + i);
        }
        return "邮件发送请求已提交";
    }
}

4. 实际应用场景

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

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

5. 其他线程池使用方式

除了 @Async 注解,还可以直接使用线程池:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;

@Service
public class ReportService {
    
    @Autowired
    private ThreadPoolTaskExecutor taskExecutor;
    
    public void generateReports() {
        for (int i = 0; i < 20; i++) {
            final int reportId = i;
            taskExecutor.execute(() -> {
                System.out.println(Thread.currentThread().getName() + " 生成报表: " + reportId);
                // 模拟报表生成
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
        }
    }
}

这个示例展示了如何在 Spring Boot 应用中配置和使用线程池来处理异步任务,提高应用性能。

posted @ 2025-06-13 17:22  佛祖让我来巡山  阅读(278)  评论(0)    收藏  举报

佛祖让我来巡山博客站 - 创建于 2018-08-15

开发工程师个人站,内容主要是网站开发方面的技术文章,大部分来自学习或工作,部分来源于网络,希望对大家有所帮助。

Bootstrap中文网