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

