spring boot 異步線程池的使用詳解
1.創(chuàng)建Spring Boot項目
首先,你需要創(chuàng)建一個Spring Boot項目。你可以使用Spring Initializr(https://start.spring.io/)來快速生成項目結構。
2.添加異步支持依賴
在你的pom.xml文件中,確保你已經添加了Spring Boot的starter依賴,特別是spring-boot-starter-web,這將提供異步支持所需的依賴。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>3.配置異步線程池參數
在Spring Boot中,你可以通過application.properties或application.yml文件來配置異步線程池的參數。以下是一個使用application.properties文件的示例:
# 異步線程池配置 async.executor.thread.core_pool_size=2 async.executor.thread.max_pool_size=10 async.executor.thread.queue_capacity=100 async.executor.thread.name.prefix=async- async.executor.thread.keep_alive_seconds=60 async.executor.thread.await_termination_seconds=60
項目啟動的時候線程池里面初始化兩個線程,當兩個線程都被占用了,又有新的任務進來先進入隊列排隊,達到隊列的最大容量100,就會創(chuàng)建一個新的線程,只到達到最大數量10個,再有新的任務進來當前線程都不是空閑狀態(tài)則會報錯。
4.編寫配置類以定義線程池
接下來,你需要編寫一個配置類,使用@Configuration注解來定義線程池。在這個配置類中,你將使用@Bean注解來創(chuàng)建一個ThreadPoolTaskExecutor實例,并根據application.properties中的配置來設置線程池的參數。
5.編寫配置類以定義線程池
接下來,你需要編寫一個配置類,使用@Configuration注解來定義線程池。在這個配置類中,你將使用@Bean注解來創(chuàng)建一個ThreadPoolTaskExecutor實例,并根據application.properties中的配置來設置線程池的參數。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
@EnableAsync
public class AsyncConfig {
@Value("${async.executor.thread.core_pool_size}")
private int corePoolSize;
@Value("${async.executor.thread.max_pool_size}")
private int maxPoolSize;
@Value("${async.executor.thread.queue_capacity}")
private int queueCapacity;
@Value("${async.executor.thread.name.prefix}")
private String namePrefix;
@Value("${async.executor.thread.keep_alive_seconds}")
private int keepAliveSeconds;
@Value("${async.executor.thread.await_termination_seconds}")
private int awaitTerminationSeconds;
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 設置核心線程數
executor.setCorePoolSize(corePoolSize);
// 設置最大線程數
executor.setMaxPoolSize(maxPoolSize);
// 設置隊列容量
executor.setQueueCapacity(queueCapacity);
// 設置線程名稱前綴
executor.setThreadNamePrefix(namePrefix);
// 線程空閑時的存活時間
executor.setKeepAliveSeconds(keepAliveSeconds);
// 關閉線程池等待任務完成的最長時間
executor.setAwaitTerminationSeconds(awaitTerminationSeconds);
// 關閉線程池等待已提交線程執(zhí)行完畢
executor.setWaitForTasksToCompleteOnShutdown(true);
// 異常策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}6.編寫異步任務類
現在,你可以編寫一個包含異步方法的類。在這個類中,你將使用@Async注解來標記需要異步執(zhí)行的方法,并指定前面定義的線程池(在這個例子中是taskExecutor)。
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncService {
// 在需要使用異步處理的方法上添加注解
@Async("taskExecutor")
public void executeAsyncTask() {
System.out.println("執(zhí)行異步任務 - " + Thread.currentThread().getName());
try {
// 模擬長時間運行的任務
Thread.sleep(5000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}7.最后,在你的控制器或其他服務類中,你可以調用這個異步方法來執(zhí)行異步任務。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AsyncController {
@Autowired
private AsyncService asyncService;
@GetMapping("/async")
public String handleAsyncRequest() {
asyncService.executeAsyncTask();
return "異步任務已啟動";
}
}通過以上步驟,你就成功地在Spring Boot中配置了異步線程池,并編寫了一個異步任務類來演示如何使用它。這樣,你就可以在需要時輕松地將任務交給線程池異步執(zhí)行了。
注意:
@Async注解不生效
從Spring容器管理的bean中調用:@Async注解的方法必須是從Spring容器管理的bean中調用的。如果從一個非Spring管理的類中調用,那么異步效果將不會生效。
自調用問題:同一個類中的方法調用不會被Spring的AOP代理捕獲,因此如果在一個類中調用同一個類的另一個@Async方法,那么異步效果也不會生效。為了避免這個問題,可以將異步方法移動到另一個bean中,并通過依賴注入來調用。
到此這篇關于spring boot 異步線程池的使用的文章就介紹到這了,更多相關spring boot 異步線程池內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- springboot CompletableFuture異步線程池詳解
- SpringBoot線程池ThreadPoolTaskExecutor異步處理百萬級數據
- Springboot?配置線程池創(chuàng)建線程及配置?@Async?異步操作線程池詳解
- SpringBoot使用異步線程池實現生產環(huán)境批量數據推送
- Spring Boot之@Async異步線程池示例詳解
- SpringBoot異步使用@Async的原理以及線程池配置詳解
- Spring Boot利用@Async異步調用:ThreadPoolTaskScheduler線程池的優(yōu)雅關閉詳解
- Spring Boot利用@Async如何實現異步調用:自定義線程池
- spring boot使用自定義配置的線程池執(zhí)行Async異步任務
相關文章
SpringBoot配置使Mybatis打印SQL執(zhí)行時的實際參數值操作
這篇文章主要介紹了SpringBoot配置使Mybatis打印SQL執(zhí)行時的實際參數值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Java mutable對象和immutable對象的區(qū)別說明
這篇文章主要介紹了Java mutable對象和immutable對象的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringAI+Ollama本地模型實現快速對話的實戰(zhàn)指南
SpringAI是Spring官方推出的AI應用開發(fā)框架,旨在統(tǒng)一封裝多種大模型,提供一套代碼無縫切換不同模型的功能,下面我們就來看看SpringAI如何結合Ollama實現快速對話功能吧2026-05-05

