Spring Boot使用線(xiàn)程池創(chuàng)建多線(xiàn)程的完整示例
在 Spring Boot 2 中,可以使用 @Autowired
注入 線(xiàn)程池(ThreadPoolTaskExecutor
或 ExecutorService
),從而管理線(xiàn)程的創(chuàng)建和執(zhí)行。以下是使用 @Autowired
方式注入線(xiàn)程池的完整示例。
1. 通過(guò) @Autowired 注入 ThreadPoolTaskExecutor
步驟 1:配置線(xiàn)程池
創(chuàng)建 ThreadPoolTaskExecutor
的 @Bean
配置:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor; @Configuration public class ThreadPoolConfig { @Bean(name = "customTaskExecutor") public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); // 核心線(xiàn)程數(shù) executor.setMaxPoolSize(10); // 最大線(xiàn)程數(shù) executor.setQueueCapacity(25); // 任務(wù)隊(duì)列容量 executor.setThreadNamePrefix("Async-Executor-"); // 線(xiàn)程名前綴 executor.initialize(); return executor; } }
步驟 2:使用 @Autowired 注入線(xiàn)程池
在 Service 層,通過(guò) @Autowired
注入 ThreadPoolTaskExecutor
并執(zhí)行任務(wù):
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import java.util.concurrent.Future; @Service public class AsyncTaskService { private static final Logger logger = LoggerFactory.getLogger(AsyncTaskService.class); @Autowired @Qualifier("customTaskExecutor") // 通過(guò) @Qualifier 指定 Bean 名稱(chēng) private ThreadPoolTaskExecutor customTaskExecutor; // 提交異步任務(wù) public void runAsyncTask() { customTaskExecutor.execute(() -> { logger.info("異步任務(wù)執(zhí)行,線(xiàn)程名:{}", Thread.currentThread().getName()); try { Thread.sleep(2000); // 模擬耗時(shí)任務(wù) } catch (InterruptedException e) { e.printStackTrace(); } logger.info("異步任務(wù)完成,線(xiàn)程名:{}", Thread.currentThread().getName()); }); } // 提交帶返回值的異步任務(wù) public Future<String> runAsyncTaskWithResult() { return customTaskExecutor.submit(() -> { logger.info("執(zhí)行帶返回值的異步任務(wù),線(xiàn)程名:{}", Thread.currentThread().getName()); Thread.sleep(2000); return "任務(wù)完成"; }); } }
步驟 3:在 Controller 中調(diào)用
在 Controller 層,通過(guò) @Autowired
調(diào)用 AsyncTaskService
:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.Future; @RestController @RequestMapping("/task") public class AsyncTaskController { @Autowired private AsyncTaskService asyncTaskService; @GetMapping("/run") public String runTask() { asyncTaskService.runAsyncTask(); return "任務(wù)已提交"; } @GetMapping("/runWithResult") public String runTaskWithResult() throws Exception { Future<String> result = asyncTaskService.runAsyncTaskWithResult(); return "任務(wù)結(jié)果:" + result.get(); } }
2. 通過(guò) @Autowired 注入 ThreadPoolTaskScheduler(適用于定時(shí)任務(wù))
步驟 1:配置 ThreadPoolTaskScheduler
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; @Configuration public class TaskSchedulerConfig { @Bean public ThreadPoolTaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(5); // 線(xiàn)程池大小 scheduler.setThreadNamePrefix("Scheduled-Task-"); scheduler.initialize(); return scheduler; } }
步驟 2:在 Service 中使用 @Autowired注入
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.stereotype.Service; import java.util.concurrent.ScheduledFuture; @Service public class ScheduledTaskService { private static final Logger logger = LoggerFactory.getLogger(ScheduledTaskService.class); @Autowired private ThreadPoolTaskScheduler taskScheduler; public void scheduleTask() { ScheduledFuture<?> future = taskScheduler.scheduleAtFixedRate(() -> { logger.info("執(zhí)行定時(shí)任務(wù),線(xiàn)程名:{}", Thread.currentThread().getName()); }, 5000); } }
步驟 3:在 Controller 中調(diào)用
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/schedule") public class ScheduleTaskController { @Autowired private ScheduledTaskService scheduledTaskService; @GetMapping("/start") public String startScheduledTask() { scheduledTaskService.scheduleTask(); return "定時(shí)任務(wù)已啟動(dòng)"; } }
3. 通過(guò) @Autowired 注入 ExecutorService
如果你更喜歡 Java 原生的 ExecutorService
,可以使用 @Bean
配置:
步驟 1:定義 ExecutorService 線(xiàn)程池
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @Configuration public class ExecutorServiceConfig { @Bean public ExecutorService fixedThreadPool() { return Executors.newFixedThreadPool(5); } }
步驟 2:在 Service 中注入 ExecutorService
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.concurrent.ExecutorService; @Service public class ExecutorServiceTask { private static final Logger logger = LoggerFactory.getLogger(ExecutorServiceTask.class); @Autowired private ExecutorService executorService; public void executeTask() { executorService.execute(() -> { logger.info("執(zhí)行任務(wù),線(xiàn)程名:{}", Thread.currentThread().getName()); }); } }
步驟 3:在 Controller 中調(diào)用
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/executor") public class ExecutorServiceController { @Autowired private ExecutorServiceTask executorServiceTask; @GetMapping("/run") public String runTask() { executorServiceTask.executeTask(); return "任務(wù)已提交"; } }
總結(jié)
方式 | 適用場(chǎng)景 | 配置方式 |
---|---|---|
ThreadPoolTaskExecutor | 普通異步任務(wù) (@Async 或 execute ) | @Autowired private ThreadPoolTaskExecutor |
ThreadPoolTaskScheduler | 定時(shí)任務(wù) | @Autowired private ThreadPoolTaskScheduler |
ExecutorService | 原生 Java 線(xiàn)程池 | @Autowired private ExecutorService |
推薦方式
- 使用
ThreadPoolTaskExecutor
結(jié)合@Autowired
來(lái)管理異步任務(wù)(推薦)。 - 使用
ThreadPoolTaskScheduler
進(jìn)行定時(shí)任務(wù)調(diào)度。 - 避免直接使用
ExecutorService
,因?yàn)樗皇?Spring 管理,不能動(dòng)態(tài)調(diào)整線(xiàn)程池參數(shù)。
這樣可以 充分利用 Spring Boot 線(xiàn)程池管理,提高系統(tǒng)性能,減少資源消耗,并且代碼更易維護(hù)! ??
到此這篇關(guān)于Spring Boot使用線(xiàn)程池創(chuàng)建多線(xiàn)程的文章就介紹到這了,更多相關(guān)Spring Boot線(xiàn)程池創(chuàng)建多線(xiàn)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java發(fā)送https請(qǐng)求代碼實(shí)例
這篇文章主要介紹了Java發(fā)送https請(qǐng)求代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08java字符串比較獲取字符串出現(xiàn)次數(shù)的示例
java獲取一個(gè)字符串在整個(gè)字符串出現(xiàn)的次數(shù),下面寫(xiě)出我的思路和二個(gè)實(shí)現(xiàn)方法,大家參考使用吧2014-01-01SpringBoot如何使用內(nèi)嵌Tomcat問(wèn)題
這篇文章主要介紹了SpringBoot如何使用內(nèi)嵌Tomcat問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Java編程實(shí)現(xiàn)二項(xiàng)分布的采樣或抽樣實(shí)例代碼
這篇文章主要介紹了Java編程實(shí)現(xiàn)二項(xiàng)分布的采樣或抽樣實(shí)例代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Java Swing中的JButton、JComboBox、JList和JColorChooser組件使用案例
這篇文章主要介紹了Java Swing中的按鈕(JButton)、組合框(JComboBox)、下拉列表(JList)和顏色選擇器(JColorChooser)組件使用案例,需要的朋友可以參考下2014-10-10idea項(xiàng)目報(bào)錯(cuò)缺失maven依賴(lài)問(wèn)題及解決
這篇文章主要介紹了idea項(xiàng)目報(bào)錯(cuò)缺失maven依賴(lài)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03淺談maven的jar包和war包區(qū)別 以及打包方法
下面小編就為大家分享一篇淺談maven的jar包和war包區(qū)別 以及打包方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-11-11Java設(shè)計(jì)模式之抽象工廠(chǎng)模式淺析講解
當(dāng)系統(tǒng)所提供的工廠(chǎng)所需生產(chǎn)的具體產(chǎn)品并不是一個(gè)簡(jiǎn)單的對(duì)象,而是多個(gè)位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中屬于不同類(lèi)型的具體產(chǎn)品時(shí)需要使用抽象工廠(chǎng)模式,抽象工廠(chǎng)模式是所有形式的工廠(chǎng)模式中最為抽象和最具一般性的一種形態(tài)2022-08-08淺談Java程序運(yùn)行機(jī)制及錯(cuò)誤分析
這篇文章主要主要介紹了Java虛擬機(jī)(JVM)的有關(guān)內(nèi)容以及Java程序的運(yùn)行機(jī)制和錯(cuò)誤分析,需要的朋友可以了解下。2017-09-09