在Spring Boot中实现多线程主要有以下6种方式,结合不同场景和需求可灵活选择:
一、@Async注解(最常用)
核心机制:通过AOP代理实现方法异步执行
实现步骤:
- 启用异步支持:主类添加
@EnableAsync
- 配置线程池:
less
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean("taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setMaxPoolSize(8);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("Async-");
executor.initialize();
return executor;
}
}
- 标记异步方法:
typescript
@Service
public class UserService {
@Async("taskExecutor")
public void sendEmail(String email) {
// 耗时操作
}
}
特点:
- 低侵入性,适合简单异步任务(日志记录/邮件发送)
- 需配合线程池配置,避免使用默认SimpleAsyncTaskExecutor
二、显式线程池(ThreadPoolTaskExecutor)
适用场景:需要精细控制线程参数的复杂任务
实现方式:
typescript
@Service
public class ReportService {
@Autowired
private ThreadPoolTaskExecutor executor;
public void generateReport() {
executor.execute(() -> {
// 处理复杂报表生成
});
}
}
核心参数:
- corePoolSize:核心线程数(默认CPU核心数)
- maxPoolSize:最大线程数(建议2倍核心线程)
- queueCapacity:队列容量(建议100-1000)
- keepAliveSeconds:空闲线程存活时间
三、CompletableFuture(异步编排)
核心优势:支持多任务组合与结果处理
典型用法:
typescript
@Service
public class OrderService {
@Async
public CompletableFuture<Boolean> checkInventory() {
return CompletableFuture.completedFuture(true);
}
public void placeOrder() {
CompletableFuture.allOf(
checkInventory(),
deductBalance()
).thenRun(() -> {
// 所有前置任务完成后执行
});
}
}
适用场景:需组合多个异步操作的复杂业务流
四、事件监听(ApplicationEvent)
实现原理:通过事件发布/订阅实现解耦
实现步骤:
- 定义事件类:
scala
public class OrderCreatedEvent extends ApplicationEvent {
public OrderCreatedEvent(Object source, Long orderId) {
super(source);
this.orderId = orderId;
}
}
- 发布事件:
typescript
@Service
public class OrderService {
@Autowired
private ApplicationEventPublisher publisher;
public void createOrder() {
publisher.publishEvent(new OrderCreatedEvent(this, 123L));
}
}
- 监听事件:
less
@Component
public class OrderListener {
@Async
@EventListener
public void handleEvent(OrderCreatedEvent event) {
// 处理后续逻辑
}
}
适用场景:系统解耦、订单创建后触发多个异步操作
五、原生Java线程池
直接使用方式:
java
@Service
public class DataService {
private ExecutorService executor = Executors.newFixedThreadPool(10);
public void processData() {
executor.submit(() -> {
// 执行耗时操作
});
}
}
适用场景:简单并发任务或临时性多线程需求
六、@Scheduled定时任务
异步定时任务配置:
less
@Configuration
@EnableAsync
@EnableScheduling
public class ScheduledConfig {
@Async
@Scheduled(fixedRate = 5000)
public void reportJob() {
// 定时执行异步任务
}
}
特点:结合定时任务与异步执行,适合周期性数据处理
线程安全注意事项
- 共享资源保护 :使用
ConcurrentHashMap
替代HashMap
- 原子操作 :通过
AtomicInteger
实现计数器 - 可见性保障 :使用
volatile
关键字修饰共享变量 - 锁机制 :必要时使用
ReentrantLock
最佳实践建议
- 统一线程池配置:避免多个线程池参数混乱
- 异常处理 :实现
AsyncUncaughtExceptionHandler
- 监控集成:通过Micrometer监控线程池状态
- 拒绝策略 :合理设置
CallerRunsPolicy
或AbortPolicy
典型应用场景对比
方式 | 适用场景 | 复杂度 | 开发效率 |
---|---|---|---|
@Async | 简单异步任务 | 低 | 高 |
CompletableFuture | 多任务编排 | 中 | 中 |
事件监听 | 系统解耦 | 中 | 中 |
显式线程池 | 高并发数据处理 | 高 | 低 |
通过合理选择多线程方案,可显著提升Spring Boot应用的吞吐量(实测可提升3-10倍)和响应速度。建议生产环境优先采用@Async+自定义线程池的组合方案。