springboot使用線程池(ThreadPoolTaskExecutor)示例
代碼倉(cāng)庫(kù):gitee
線程池創(chuàng)建
@Configuration @EnableAsync public class TaskPoolConfig { @Bean("syncExecutorPool") public Executor taskExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); // 核心池大小 taskExecutor.setCorePoolSize(5); // 最大線程數(shù) taskExecutor.setMaxPoolSize(10); // 隊(duì)列程度 taskExecutor.setQueueCapacity(100); // 線程空閑時(shí)間 taskExecutor.setKeepAliveSeconds(60); // 線程前綴名稱 taskExecutor.setThreadNamePrefix("syncExecutor--"); // 該方法用來(lái)設(shè)置 線程池關(guān)閉 的時(shí)候 等待 所有任務(wù)都完成后,再繼續(xù) 銷毀 其他的 Bean, // 這樣這些 異步任務(wù) 的 銷毀 就會(huì)先于 數(shù)據(jù)庫(kù)連接池對(duì)象 的銷毀。 taskExecutor.setWaitForTasksToCompleteOnShutdown(true); // 任務(wù)的等待時(shí)間 如果超過(guò)這個(gè)時(shí)間還沒(méi)有銷毀就 強(qiáng)制銷毀,以確保應(yīng)用最后能夠被關(guān)閉,而不是阻塞住。 taskExecutor.setAwaitTerminationSeconds(60); // 線程不夠用時(shí)由調(diào)用的線程處理該任務(wù) taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); return taskExecutor; } }
線程池參數(shù)
核心線程數(shù)量:CorePoolSize
看業(yè)務(wù)場(chǎng)景設(shè)置(我通常設(shè)置為CPU核心*1)
最大線程數(shù)量:MaxPoolSize
當(dāng)核心線程數(shù)量都在使用狀態(tài)時(shí),會(huì)調(diào)用最大線程數(shù)量里的線程,使用的總線程不會(huì)超過(guò)最大線程數(shù)量,其余則等待(我通常設(shè)置為CPU核心*2)
隊(duì)列程度:QueueCapacity
線程隊(duì)列的大小
線程空閑時(shí)間:KeepAliveSeconds
線程前綴名稱:ThreadNamePrefix
停機(jī)策略:WaitForTasksToCompleteOnShutdown
該方法用來(lái)設(shè)置 線程池關(guān)閉 的時(shí)候 等待 所有任務(wù)都完成后,再繼續(xù) 銷毀 其他的 Bean,這樣這些 異步任務(wù) 的 銷毀 就會(huì)先于 數(shù)據(jù)庫(kù)連接池對(duì)象 的銷毀。
任務(wù)的等待時(shí)間:AwaitTerminationSeconds
任務(wù)的等待時(shí)間 如果超過(guò)這個(gè)時(shí)間還沒(méi)有銷毀就 強(qiáng)制銷毀,以確保應(yīng)用最后能夠被關(guān)閉,而不是阻塞住
拒接策略:RejectedExecutionHandler
線程不夠用時(shí)由調(diào)用的線程處理該任務(wù)
線程池測(cè)試1(核心線程數(shù)量)
結(jié)果:線程池的核心線程數(shù)量輪訓(xùn)執(zhí)行
線程池測(cè)試2(當(dāng)核心線程數(shù)量和最大線程數(shù)量不夠時(shí))
隨機(jī)睡眠0-10000毫秒
new Random().nextInt(10000)
結(jié)果:
當(dāng)5個(gè)核心線程數(shù)量不夠用時(shí),使用最大線程數(shù)量里的線程
當(dāng)最大線程數(shù)量不夠用時(shí),使用主線程執(zhí)行該任務(wù)
// 線程不夠用時(shí)由調(diào)用的線程處理該任務(wù)
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
總結(jié)
到此這篇關(guān)于springboot使用線程池(ThreadPoolTaskExecutor)示例的文章就介紹到這了,更多相關(guān)springboot線程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot使用TaskScheduler實(shí)現(xiàn)動(dòng)態(tài)增刪啟停定時(shí)任務(wù)方式
- springboot使用ThreadPoolTaskExecutor多線程批量插入百萬(wàn)級(jí)數(shù)據(jù)的實(shí)現(xiàn)方法
- 使用spring-task定時(shí)任務(wù)動(dòng)態(tài)配置修改執(zhí)行時(shí)間
- Spring Boot 使用WebAsyncTask異步返回結(jié)果
- Spring Task定時(shí)任務(wù)的配置和使用詳解
- 分布式調(diào)度器之Spring Task 的使用詳解
相關(guān)文章
Java中Random簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本文詳細(xì)給大家介紹了Java中Random簡(jiǎn)介相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-06-06springBoot 打war包 程序包c(diǎn)om.sun.istack.internal不存在的問(wèn)題及解決方案
這篇文章主要介紹了springBoot 打war包 程序包c(diǎn)om.sun.istack.internal不存在的問(wèn)題及解決方案,親測(cè)試過(guò)可以,需要的朋友可以參考下2018-07-07springBoot快速訪問(wèn)工程目錄下的靜態(tài)資源
springboot工程,是沒(méi)有webapp文件夾的,靜態(tài)文件放在src/main/resources/static文件夾下即可,模板文件放在src/main/resources/templates下,本文給大家介紹springBoot快速訪問(wèn)工程目錄下的靜態(tài)資源的相關(guān)知識(shí),一起看看吧2021-06-06Mybatis注解sql時(shí)出現(xiàn)的一個(gè)錯(cuò)誤及解決
這篇文章主要介紹了Mybatis注解sql時(shí)出現(xiàn)的一個(gè)錯(cuò)誤及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Java基礎(chǔ)之Bean的創(chuàng)建、定位和使用
這篇文章主要介紹了Java基礎(chǔ)之Bean的創(chuàng)建、定位和使用,文中有非常詳細(xì)的圖文示例及代碼,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05SpringBoot繼承LogStash實(shí)現(xiàn)日志收集的方法示例
這篇文章主要介紹了SpringBoot繼承LogStash實(shí)現(xiàn)日志收集的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05詳解JDBC的概念及獲取數(shù)據(jù)庫(kù)連接的5種方式
Java?DataBase?Connectivity是將Java與SQL結(jié)合且獨(dú)立于特定的數(shù)據(jù)庫(kù)系統(tǒng)的應(yīng)用程序編程接口,一種可用于執(zhí)行SQL語(yǔ)句的JavaAPI。本文主要介紹了JDBC的概念及獲取數(shù)據(jù)庫(kù)連接的5種方式,需要的可以參考一下2022-09-09Spring aop+反射實(shí)現(xiàn)電話號(hào)加密
線上項(xiàng)目涉及大量查詢接口中,存在電話號(hào)明文展示不合規(guī)的問(wèn)題。如果對(duì)每個(gè)接口返回結(jié)果中電話號(hào)相關(guān)字段修改相關(guān)代碼邏輯,則工作量較大花費(fèi)時(shí)間多。因此設(shè)計(jì)電話號(hào)加密注解,減少工作量。2021-06-06Java基礎(chǔ)知識(shí)精通二維數(shù)組的應(yīng)用
為了方便組織各種信息,計(jì)算機(jī)常將信息以表的形式進(jìn)行組織,然后再以行和列的形式呈現(xiàn)出來(lái)。二維數(shù)組的結(jié)構(gòu)決定了其能非常方便地表示計(jì)算機(jī)中的表,以第一個(gè)下標(biāo)表示元素所在的行,第二個(gè)下標(biāo)表示元素所在的列。下面簡(jiǎn)單了解一下二維數(shù)組,包括數(shù)組的聲明和初始化2022-04-04理解JDK動(dòng)態(tài)代理為什么必須要基于接口
這篇文章主要介紹了理解JDK動(dòng)態(tài)代理為什么必須要基于接口,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10