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