SpringBoot中實現(xiàn)多線程六種方式大全
Spring Boot 提供了非常豐富的多線程支持手段,從最簡單的注解到虛擬線程(Java 21+ / 25+ 時代的主流方向),可以滿足從簡單異步任務(wù)到高并發(fā) IO/CPU 密集型場景的各種需求。
下面列出目前(2026 年視角)最常用、最推薦的 6 種方式,并按推薦優(yōu)先級排序(從最常用 → 最前沿)。
1. @Async + @EnableAsync(最常用、最簡單)
核心步驟:
- 啟動類或配置類加
@EnableAsync - 方法加
@Async - (可選)自定義線程池
ThreadPoolTaskExecutor
// 開啟異步
@EnableAsync
@SpringBootApplication
public class Application { ... }
// 異步方法
@Service
public class MailService {
@Async
public void sendMail(String to, String content) {
// 耗時操作
log.info("發(fā)送郵件中... Thread: {}", Thread.currentThread().getName());
}
}
自定義線程池(強烈推薦):
@Configuration
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(8);
executor.setMaxPoolSize(16);
executor.setQueueCapacity(200);
executor.setThreadNamePrefix("async-mail-");
// 拒絕策略(很重要?。?
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (ex, method, params) -> log.error("異步異常", ex);
}
}
優(yōu)點:零侵入、簡單
缺點:無法獲取返回值(需配合 CompletableFuture)
2. CompletableFuture + @Async(有返回值 + 鏈式編排)
適用場景:需要異步結(jié)果、任務(wù)編排、并行聚合、超時控制
@Service
public class UserService {
@Async
public CompletableFuture<User> getUserById(Long id) {
// 模擬耗時
Thread.sleep(1000);
return CompletableFuture.completedFuture(new User(id));
}
public CompletableFuture<List<User>> batchGetUsers(List<Long> ids) {
List<CompletableFuture<User>> futures = ids.stream()
.map(this::getUserById)
.toList();
return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
.thenApply(v -> futures.stream().map(CompletableFuture::join).toList());
}
}
優(yōu)點:強大組合能力、異常處理友好
缺點:代碼稍復雜
3. ThreadPoolTaskExecutor 手動提交任務(wù)(最靈活)
適用場景:需要精細控制線程池、批量任務(wù)、自定義拒絕策略
@Autowired
private ThreadPoolTaskExecutor executor;
public void processBatch(List<Task> tasks) {
List<CompletableFuture<Void>> futures = new ArrayList<>();
for (Task task : tasks) {
CompletableFuture<Void> future = CompletableFuture.runAsync(task::execute, executor);
futures.add(future);
}
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
}
4. Java 原生方式(Executors / Thread / Runnable / Callable)
適用場景:不依賴 Spring 容器、測試、工具類、極簡場景
// 方式1:直接 new Thread(不推薦) new Thread(() -> doSomething()).start(); // 方式2:Executors 工具類 ExecutorService executor = Executors.newFixedThreadPool(10); executor.submit(() -> doSomething());
注意:生產(chǎn)環(huán)境強烈不建議直接用 Executors.newFixedThreadPool(),因為 OOM 風險極大(無界隊列)。
5. 虛擬線程(Java 21+ / Spring Boot 3.2+ / 3.3+ 強烈推薦)
適用場景:高并發(fā) IO 密集型場景(接口調(diào)用、文件讀寫、數(shù)據(jù)庫查詢等)
開啟方式(Spring Boot 3.2+):
# application.yml
spring:
threads:
virtual:
enabled: true
或代碼方式:
@Bean
public TaskExecutor taskExecutor() {
return Executors.newVirtualThreadPerTaskExecutor();
}
@Async 也會自動使用虛擬線程(當啟用后)
優(yōu)點:線程創(chuàng)建成本極低、可創(chuàng)建數(shù)十萬線程、極大提升吞吐量
缺點:CPU 密集型任務(wù)不適合(仍建議用固定線程池)
6. Spring 定時任務(wù) + 多線程(@Scheduled + 線程池)
適用場景:定時批量處理、爬蟲、清理任務(wù)
@Configuration
@EnableScheduling
@EnableAsync
public class ScheduleConfig {
@Scheduled(cron = "0 */5 * * * ?")
@Async("batchExecutor")
public void processBatchJob() {
// 批量處理邏輯
}
@Bean("batchExecutor")
public ThreadPoolTaskExecutor batchExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setMaxPoolSize(8);
// ...
return executor;
}
}
推薦優(yōu)先級總結(jié)(2026 年視角)
| 優(yōu)先級 | 方式 | 推薦場景 | 推薦指數(shù) |
|---|---|---|---|
| ★★★★★ | @Async + 自定義線程池 | 99% 普通異步任務(wù) | 最高 |
| ★★★★☆ | CompletableFuture | 需要結(jié)果、編排、并行聚合 | 很高 |
| ★★★★☆ | 虛擬線程(enabled=true) | 高并發(fā) IO 密集型 | 強烈推薦 |
| ★★★☆☆ | ThreadPoolTaskExecutor 手動 | 精細控制、批量任務(wù) | 常用 |
| ★★☆☆☆ | Java 原生 Executors | 非 Spring 場景、測試 | 謹慎 |
| ★★☆☆☆ | @Scheduled + 多線程 | 定時批量處理 | 特定場景 |
性能提升關(guān)鍵點(架構(gòu)層面)
- 異步化非核心路徑(郵件、日志、推送、文件處理)
- 線程池參數(shù)合理調(diào)優(yōu)(核心數(shù) ≈ CPU核數(shù)*2 ~ 3,隊列容量 50~200)
- 拒絕策略選 CallerRunsPolicy(防止雪崩)
- 異常捕獲(@Async 方法異常默認被吞掉)
- 虛擬線程優(yōu)先(IO 密集場景可提升 5~20 倍吞吐)
- 監(jiān)控(Micrometer + Prometheus + Grafana 監(jiān)控線程池狀態(tài))
你當前項目中主要想解決哪類多線程問題?
是接口響應慢、批量任務(wù)卡頓、還是想引入虛擬線程?可以告訴我具體場景,我可以給出更針對性的代碼和調(diào)優(yōu)建議。
以上就是SpringBoot中實現(xiàn)多線程六種方式大全的詳細內(nèi)容,更多關(guān)于SpringBoot實現(xiàn)多線程方式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java concurrency之共享鎖和ReentrantReadWriteLock_動力節(jié)點Java學院整理
本篇文章主要介紹了Java concurrency之共享鎖和ReentrantReadWriteLock,非常具有實用價值,需要的朋友可以參考下2017-06-06
java組件commons-fileupload實現(xiàn)文件上傳
這篇文章主要介紹了java借助commons-fileupload組件實現(xiàn)文件上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
Spring Boot 訪問安全之認證和鑒權(quán)詳解
這篇文章主要介紹了Spring Boot 訪問安全之認證和鑒權(quán),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
springboot之security?FilterSecurityInterceptor的使用要點記錄
這篇文章主要介紹了springboot之security?FilterSecurityInterceptor的使用要點記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12

