SpringBoot 整合線程池的示例詳解
線程池簡介
什么是線程池
線程池是一種利用池化技術思想來實現(xiàn)的線程管理技術,主要是為了復用線程、便利地管理線程和任務、并將線程的創(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 # 線程關閉等待 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()); //等待所有任務結束后再關閉線程池 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 }
到此這篇關于SpringBoot 整合線程池的文章就介紹到這了,更多相關SpringBoot 整合線程池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Eclipse開發(fā)工具如何解決Java Compiler中Annotation Processin不出現(xiàn)的問題
這篇文章主要介紹了使用Eclipse開發(fā)工具如何解決Java Compiler中Annotation Processin不出現(xiàn)的相關資料,需要的朋友可以參考下2015-11-11SpringBoot整合Redis的哨兵模式的實現(xiàn)
Redis提供了哨兵模式來處理主從切換和故障轉移,本文主要介紹了SpringBoot整合Redis的哨兵模式的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-08-08