一、概念
????????線程池就是將多個線程對象放入一個池子里面,例如一個池塘,線程池就是這個池塘,池塘里面的魚就是線程池中的多個線程對象。1. 每一個線程,在一段時間內只能執行一個任務。2. 線程池中的各個線程是可以重復使用的。
二、創建線程池的基本步驟
-
添加依賴(如果你使用的是Spring Boot,通常已經包含了必要的依賴):
確保你的
pom.xml
(Maven)或build.gradle
(Gradle)文件中包含了Spring Boot的依賴。 -
配置線程池:
在你的Spring Boot配置類(通常帶有
@Configuration
注解)中,你可以創建一個TaskExecutor
的Bean。例如,使用ThreadPoolTaskExecutor
:@Configuration @EnableAsync public class AsyncConfig { @Bean(name = "taskExecutor") public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(10); executor.setQueueCapacity(25); executor.setThreadNamePrefix("Async-"); executor.initialize(); return executor; } }
注意
@EnableAsync
注解,它啟用了異步方法的支持。你可以將此注解放在你的配置類上,或者使用@Async
注解在你的服務或組件中直接指定某個方法為異步執行。線程池的參數說明:
corePoolSize:核心線程數
maximumPoolSize:最大線程數
keepAliveTime:最大空閑時間
unit:最大空閑時間單位
workQueue:任務隊列
handler:拒絕策略,有以下四種
(1)ThreadPoolExecutor.AbortPolicy 丟棄任務,并拋出 RejectedExecutionException 異常。
(2)ThreadPoolExecutor.CallerRunsPolicy:該任務被線程池拒絕,由調用 execute方法的線程執行該任務。
(3)ThreadPoolExecutor.DiscardOldestPolicy : 拋棄隊列最前面的任務,然后重新嘗試執行任務。
(4)ThreadPoolExecutor.DiscardPolicy,丟棄任務,不過也不拋出異常。
也可以自己實現RejectedExecutionHandler接口來自定義拒絕策略
-
使用線程池:
在你的服務或組件中,你可以使用
@Async
注解來指定某個方法應該異步執行,并使用上面配置的線程池。Spring會自動使用你配置的TaskExecutor
來執行這些方法。@Service public class AsyncService { @Autowired private TaskExecutor taskExecutor; // 也可以使用@Qualifier指定具體的Bean名,如@Qualifier("taskExecutor") // 或者你可以直接通過@Async注解并使用默認配置的線程池 @Async public void asyncMethod() { // 異步執行的代碼 } // 使用自定義的TaskExecutor執行異步任務 public void executeAsync(Runnable task) { taskExecutor.execute(task); } }
請注意,如果你的
AsyncService
中的方法是通過接口定義的,并且你正在使用基于接口的代理(這是Spring AOP的默認行為),那么只有通過代理調用這些方法時,@Async
注解才會生效。這意味著,如果你從同一個類的另一個方法中調用帶有@Async
注解的方法,它不會異步執行。 -
監控和調優:
?你可以使用Spring Boot的Actuator模塊來監控你的線程池。通過添加Actuator的依賴并啟用相關端點,你可以查看線程池的實時狀態,如當前線程數、活動線程數、任務隊列大小等。這有助于你根據應用程序的實際需求調整線程池的配置。