SpringBoot 整合線程池的示例詳解
線程池簡介
什么是線程池
線程池是一種利用池化技術(shù)思想來實現(xiàn)的線程管理技術(shù),主要是為了復用線程、便利地管理線程和任務、并將線程的創(chuàng)建和任務的執(zhí)行解耦開來。我們可以創(chuàng)建線程池來復用已經(jīng)創(chuàng)建的線程來降低頻繁創(chuàng)建和銷毀線程所帶來的資源消耗。在JAVA中主要是使用ThreadPoolExecutor類來創(chuàng)建線程池,并且JDK中也提供了Executors工廠類來創(chuàng)建線程池(不推薦使用)。
線程池的優(yōu)點
- 降低資源消耗,復用已創(chuàng)建的線程來降低創(chuàng)建和銷毀線程的消耗。
- 提高響應速度,任務到達時,可以不需要等待線程的創(chuàng)建立即執(zhí)行。
- 提高線程的可管理性,使用線程池能夠統(tǒng)一的分配、調(diào)優(yōu)和監(jiān)控。
1.啟動類加 @EnableAsync 注解
@SpringBootApplication
@EnableAsync
public class FacadeH5Application {
public static void main(String[] args) {
SpringApplication.run(FacadeH5Application.class, args);
}
}2.在方法上加 @Async 注解
@Async
public void m1() {
//do something
}注意:導致 @Async 注解失效的幾個原因
- 兩個方法都在同一個類里面,一個方法調(diào)用另一個異步方法,不生效。但是如果在本類中注入自己的實例,再通過自己的實例調(diào)用異步方法就可行。
- @Async 方法所在的類沒有交給 spring 代理(沒加諸如@Component注解),不生效。
- 注解的方法不是是public方法,不生效。
3.創(chuàng)建線程池配置類
默認的線程池配置如下
# 核心線程數(shù) spring.task.execution.pool.core-size=8 # 最大線程數(shù) spring.task.execution.pool.max-size=16 # 空閑線程存活時間 spring.task.execution.pool.keep-alive=60s # 是否允許核心線程超時 spring.task.execution.pool.allow-core-thread-timeout=true # 線程隊列數(shù)量 spring.task.execution.pool.queue-capacity=100 # 線程關(guān)閉等待 spring.task.execution.shutdown.await-termination=false spring.task.execution.shutdown.await-termination-period= # 線程名稱前綴 spring.task.execution.thread-name-prefix=task-
創(chuàng)建線程池配置類
@Configuration
public class ThreadPoolConfig {
@Bean
public TaskExecutor taskExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//設置核心線程數(shù)
executor.setCorePoolSize(10);
//設置最大線程數(shù)
executor.setMaxPoolSize(20);
//設置隊列容量
executor.setQueueCapacity(20);
//設置線程活躍時間
executor.setKeepAliveSeconds(30);
//設置線程名稱前綴
executor.setThreadNamePrefix("sendSms-");
//設置拒絕策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//等待所有任務結(jié)束后再關(guān)閉線程池
executor.setWaitForTasksToCompleteOnShutdown(true);
//設置線程池中任務的等待時間
executor.setAwaitTerminationSeconds(60);
return executor;
}
}配置多個線程池
有時候,一個項目中如果配置了多個線程池,那需要在 @Bean后面加上線程池的名稱
@Configuration
public class ThreadPoolConfig {
@Bean("ThreadPool1")
public TaskExecutor taskExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
......
return executor;
}
@Bean("ThreadPool2")
public TaskExecutor taskExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
......
return executor;
}
}在使用 @Async注解時就需要指明具體使用的線程池,如下格式
@Async("ThreadPool1")
public void m1() {
//do something
}到此這篇關(guān)于SpringBoot 整合線程池的文章就介紹到這了,更多相關(guān)SpringBoot 整合線程池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Eclipse開發(fā)工具如何解決Java Compiler中Annotation Processin不出現(xiàn)的問題
這篇文章主要介紹了使用Eclipse開發(fā)工具如何解決Java Compiler中Annotation Processin不出現(xiàn)的相關(guān)資料,需要的朋友可以參考下2015-11-11
SpringMVC自定義類型轉(zhuǎn)換器實現(xiàn)解析
這篇文章主要介紹了SpringMVC自定義類型轉(zhuǎn)換器實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12
SpringBoot整合Redis的哨兵模式的實現(xiàn)
Redis提供了哨兵模式來處理主從切換和故障轉(zhuǎn)移,本文主要介紹了SpringBoot整合Redis的哨兵模式的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-08-08

