Spring Boot使用線程池創建多線程

Spring Boot 2 中,可以使用 @Autowired 注入 線程池ThreadPoolTaskExecutorExecutorService),從而管理線程的創建和執行。以下是使用 @Autowired 方式注入線程池的完整示例。


1. 通過 @Autowired 注入 ThreadPoolTaskExecutor

步驟 1:配置線程池

創建 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);  // 核心線程數executor.setMaxPoolSize(10);  // 最大線程數executor.setQueueCapacity(25); // 任務隊列容量executor.setThreadNamePrefix("Async-Executor-"); // 線程名前綴executor.initialize();return executor;}
}

步驟 2:使用 @Autowired 注入線程池

Service 層,通過 @Autowired 注入 ThreadPoolTaskExecutor 并執行任務:

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") // 通過 @Qualifier 指定 Bean 名稱private ThreadPoolTaskExecutor customTaskExecutor;// 提交異步任務public void runAsyncTask() {customTaskExecutor.execute(() -> {logger.info("異步任務執行,線程名:{}", Thread.currentThread().getName());try {Thread.sleep(2000); // 模擬耗時任務} catch (InterruptedException e) {e.printStackTrace();}logger.info("異步任務完成,線程名:{}", Thread.currentThread().getName());});}// 提交帶返回值的異步任務public Future<String> runAsyncTaskWithResult() {return customTaskExecutor.submit(() -> {logger.info("執行帶返回值的異步任務,線程名:{}", Thread.currentThread().getName());Thread.sleep(2000);return "任務完成";});}
}

步驟 3:在 Controller 中調用

Controller 層,通過 @Autowired 調用 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 {@Autowiredprivate AsyncTaskService asyncTaskService;@GetMapping("/run")public String runTask() {asyncTaskService.runAsyncTask();return "任務已提交";}@GetMapping("/runWithResult")public String runTaskWithResult() throws Exception {Future<String> result = asyncTaskService.runAsyncTaskWithResult();return "任務結果:" + result.get();}
}

2. 通過 @Autowired 注入 ThreadPoolTaskScheduler(適用于定時任務)

步驟 1:配置 ThreadPoolTaskScheduler

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;@Configuration
public class TaskSchedulerConfig {@Beanpublic ThreadPoolTaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setPoolSize(5);  // 線程池大小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);@Autowiredprivate ThreadPoolTaskScheduler taskScheduler;public void scheduleTask() {ScheduledFuture<?> future = taskScheduler.scheduleAtFixedRate(() -> {logger.info("執行定時任務,線程名:{}", Thread.currentThread().getName());}, 5000);}
}

步驟 3:在 Controller 中調用

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 {@Autowiredprivate ScheduledTaskService scheduledTaskService;@GetMapping("/start")public String startScheduledTask() {scheduledTaskService.scheduleTask();return "定時任務已啟動";}
}

3. 通過 @Autowired 注入 ExecutorService

如果你更喜歡 Java 原生的 ExecutorService,可以使用 @Bean 配置:

步驟 1:定義 ExecutorService 線程池

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 {@Beanpublic 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);@Autowiredprivate ExecutorService executorService;public void executeTask() {executorService.execute(() -> {logger.info("執行任務,線程名:{}", Thread.currentThread().getName());});}
}

步驟 3:在 Controller 中調用

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 {@Autowiredprivate ExecutorServiceTask executorServiceTask;@GetMapping("/run")public String runTask() {executorServiceTask.executeTask();return "任務已提交";}
}

總結

方式適用場景配置方式
ThreadPoolTaskExecutor普通異步任務 (@Asyncexecute)@Autowired private ThreadPoolTaskExecutor
ThreadPoolTaskScheduler定時任務@Autowired private ThreadPoolTaskScheduler
ExecutorService原生 Java 線程池@Autowired private ExecutorService

推薦方式

  • 使用 ThreadPoolTaskExecutor 結合 @Autowired 來管理異步任務(推薦)。
  • 使用 ThreadPoolTaskScheduler 進行定時任務調度。
  • 避免直接使用 ExecutorService,因為它不受 Spring 管理,不能動態調整線程池參數。

這樣可以 充分利用 Spring Boot 線程池管理,提高系統性能,減少資源消耗,并且代碼更易維護! 🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73620.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73620.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73620.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

9、交付手段-強化肌肉記憶(隨身工具箱)

一、交付工具箱 當臨時遇到各類交付棘手問題時&#xff0c;大腦里記住交付工具的使用場景&#xff0c;有利于快速決策&#xff0c;將這些工具轉為肌肉記憶&#xff0c;能夠快速靈活處理交付中的各類問題&#xff0c;蛻變為交付之星 1、復雜項目&#xff1a;WBS分解、日站會、…

【概念】Node.js,Express.js MongoDB Mongoose Express-Validator Async Handler

1. Node.js 定義&#xff1a;Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行時環境&#xff0c;允許你在服務器端運行 JavaScript 代碼。作用&#xff1a;它使得開發者可以使用 JavaScript 編寫服務器端代碼&#xff0c;從而實現前后端使用同一種語言。比喻&#xff1a…

【GPT入門】第22課 langchain LCEL介紹

【GPT入門】第22課 langchain LCEL介紹 1. LCEL介紹與特點2. 原生API與LCEL的對比2. 簡單demo 1. LCEL介紹與特點 LCEL 即 LangChain Expression Language&#xff0c;是 LangChain 推出的一種聲明式語言&#xff0c;用于簡化和優化在 LangChain 框架內構建復雜鏈和應用的過程…

數據結構——單鏈表list

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介紹數據結構——單鏈表 目錄 一、單鏈表 二、使用步驟 1.結構體定義 2.初始化 3.插入 3.1 頭插 3.2 尾插 3.3 按位置插 四.刪除 4.1頭刪 4.2 尾刪 4.3 按位置刪 4.4按值刪 五 統計有效值個數 六 銷毀…

堆排序:力扣215.數組中的第K個大元素

一、問題描述 在一個整數數組 nums 中&#xff0c;需要找出第 k 個最大的元素。這里要注意&#xff0c;我們要找的是數組排序后的第 k 個最大元素&#xff0c;而不是第 k 個不同的元素。例如&#xff0c;對于數組 [3,2,1,5,6,4]&#xff0c;當 k 2 時&#xff0c;第 2 個最大…

C語言(25)

一.數據在內存中的存儲 1.整數在內存中的存儲 整數在內存中以二進制的形式儲存&#xff0c;分別為原碼&#xff0c;補碼&#xff0c;反碼 有符號的整數&#xff0c;在上述三種形式都有符號位和數值位兩個部分&#xff0c;符號位為0是正數&#xff0c;1是負數&#xff0c;最高…

鴻蒙開發-一多開發之媒體查詢功能

在HarmonyOS中&#xff0c;使用ArkTS語法實現響應式布局的媒體查詢是一個強大的功能&#xff0c;它允許開發者根據不同的設備特征&#xff08;如屏幕尺寸、屏幕方向等&#xff09;動態地調整UI布局和樣式。以下是一個使用媒體查詢實現響應式布局的實例&#xff1a; 1. 導入必要…

Docker運行hello-world鏡像失敗或超時:Unable to find image ‘hello-world:latest‘ locally Trying to pull reposi

Docker運行hello-world鏡像失敗或超時&#xff0c;報錯&#xff1a;Unable to find image ‘hello-world:latest’ locally Trying to pull repository docker.io/library/hello-world … /usr/bin/docker-current: missing signature key. See ‘/usr/bin/docker-current run …

MySQL連接較慢原因分析及解決措施

文章目錄 整體說明一、問題現象二、問題分析2.1、DNS反向解析問題2.2、網絡問題2.3、SSL/TLS協商問題2.4、自動補全的延遲 三、問題解決 摘要&#xff1a; MySQL連接較慢原因分析及解決措施 關鍵詞&#xff1a; MySQL、連接緩慢、客戶端、參數設置 整體說明 在使用MySQL的時候…

doris:安全概覽

oris 提供以下機制管理數據安全&#xff1a; 身份認證&#xff1a;Doris 支持用戶名/密碼與 LDAP 認證方式。 內置認證&#xff1a;Doris 內置了用戶名/密碼的認證方式&#xff0c;可以自定義密碼策略&#xff1b; LDAP 認證&#xff1a;Doris 可以通過 LDAP 服務集中管理用戶…

C++之文字修仙小游戲

1 效果 1.1 截圖 游戲運行&#xff1a; 存檔&#xff1a; 1.2 游玩警告 注意&#xff01;不要修改裝備概率&#xff0c;裝備的概率都是湊好的數字。如果想要速升&#xff0c;修改靈石數量 2 代碼 2.1 代碼大綱 1. 游戲框架與初始化 控制臺操作&#xff1a;通過 gotoxy() …

Docker安裝部署RabbitMQ

Docker安裝部署RabbitMQ 本文介紹了如何在Linux&#xff08;CentOS 7&#xff09;系統環境下的Docker上安裝部署RabbitMQ的詳細過程。 目錄 Docker安裝部署RabbitMQ一、環境準備1.Linux環境2.Docker3.停止并移除現有的 RabbitMQ 鏡像和容器 二、安裝部署RabbitMQ1.拉取 RabbitM…

【MyBatis Plus 邏輯刪除詳解】

文章目錄 MyBatis Plus 邏輯刪除詳解前言什么是邏輯刪除&#xff1f;MyBatis Plus 中的邏輯刪除1. 添加邏輯刪除字段2. 實體類的配置3. 配置 MyBatis Plus4. 使用邏輯刪除5. 查詢邏輯刪除的記錄 MyBatis Plus 邏輯刪除詳解 前言 MyBatis Plus 是一個強大的持久化框架&#xf…

線性代數(1)用 excel 計算雞兔同籠

線性代數excel計算雞兔同籠 案例&#xff1a;雞兔同籠問題的三種解法&#xff08;遞進式教學&#xff09;一、問題描述二、方程式解法&#xff08;基礎版&#xff09;步驟解析 三、線性代數解法&#xff08;進階版&#xff09;1. 方程組轉化為矩陣形式2. 矩陣求解&#xff08;逆…

Flask中使用WTForms處理表單驗證

在 Flask 中&#xff0c;WTForms 是一個用于 處理表單驗證 的庫&#xff0c;可以與 Flask 結合&#xff0c;提供表單驗證、數據清理、錯誤提示等功能。 1. 安裝 Flask-WTF 首先安裝 Flask-WTF&#xff1a; pip install Flask-WTFFlask-WTF 是 WTForms 的 Flask 擴展&#xff…

24.策略模式實現日志

日志的介紹 計算機中的日志是記錄系統和軟件運行中發送事件的文件&#xff0c;主要作用是監控運行狀態、記錄異常信息&#xff0c;幫助快速定位問題并支持程序員進行問題修復。它是系統維護、故障排查和安全管理的重要工具。 日志格式以下幾個指標是必須得有的&#xff1a; ?…

【網絡】簡單的 Web 服務器架構解析,包含多個服務和反向代理的配置,及非反向代理配置

這張圖片描述了一個簡單的 Web 服務器架構&#xff0c;包含多個服務和反向代理的配置。以下是對每個部分的詳細解釋&#xff0c;幫助你理解其中的技術內容&#xff1a; 1. Web Server: ifn666.com 這是你的主域名&#xff08;ifn666.com&#xff09;&#xff0c;所有服務都通過…

???????大語言模型安全風險分析及相關解決方案

大語言模型的安全風險可以從多個維度進行分類。 從輸入輸出的角度來看,存在提示注入、不安全輸出處理、惡意內容生成和幻覺錯誤等風險; 從數據層面來看,訓練數據中毒、敏感信息泄露和模型反演攻擊是主要威脅; 模型自身則面臨拒絕服務和盜竊的風險; 供應鏈和插件的不安全引…

貪心算法——c#

貪心算法通俗解釋 貪心算法是一種"每一步都選擇當前最優解"的算法策略。它不關心全局是否最優&#xff0c;而是通過局部最優的累積來逼近最終解。優點是簡單高效&#xff0c;缺點是可能無法得到全局最優解。 一句話秒懂 自動售貨機找零錢&#xff1a;用最少數量的…

STM32 - 在機器人領域,LL庫相比HAL優勢明顯

在機器人控制器、電機控制器等領域的開發&#xff0c;需要高實時性、精細化控制或者對代碼執行效率、占用空間有較高要求。所以&#xff0c;大家常用的HAL庫明顯不符合要求。再加上&#xff0c;我們學習一門技術&#xff0c;一定要學會掌握底層的原理。MCU開發的底層就是寄存器…