Spring線程池ThreadPoolTaskExecutor配置詳情
本文介紹了Spring線程池ThreadPoolTaskExecutor配置,分享給大家,具體如下:
1. ThreadPoolTaskExecutor配置
<!-- spring thread pool executor --> <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 線程池維護線程的最少數(shù)量 --> <property name="corePoolSize" value="5" /> <!-- 允許的空閑時間 --> <property name="keepAliveSeconds" value="200" /> <!-- 線程池維護線程的最大數(shù)量 --> <property name="maxPoolSize" value="10" /> <!-- 緩存隊列 --> <property name="queueCapacity" value="20" /> <!-- 對拒絕task的處理策略 --> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /> </property> </bean>
屬性字段說明
corePoolSize:線程池維護線程的最少數(shù)量
keepAliveSeconds:允許的空閑時間
maxPoolSize:線程池維護線程的最大數(shù)量
queueCapacity:緩存隊列
rejectedExecutionHandler:對拒絕task的處理策略
2. execute(Runable)方法執(zhí)行過程
如果此時線程池中的數(shù)量小于corePoolSize,即使線程池中的線程都處于空閑狀態(tài),也要創(chuàng)建新的線程來處理被添加的任務。
如果此時線程池中的數(shù)量等于 corePoolSize,但是緩沖隊列 workQueue未滿,那么任務被放入緩沖隊列。
如果此時線程池中的數(shù)量大于corePoolSize,緩沖隊列workQueue滿,并且線程池中的數(shù)量小于maxPoolSize,建新的線程來處理被添加的任務。
如果此時線程池中的數(shù)量大于corePoolSize,緩沖隊列workQueue滿,并且線程池中的數(shù)量等于maxPoolSize,那么通過handler所指定的策略來處理此任務。也就是:處理任務的優(yōu)先級為:核心線程corePoolSize、任務隊列workQueue、最大線程 maximumPoolSize,如果三者都滿了,使用handler處理被拒絕的任務。
當線程池中的線程數(shù)量大于corePoolSize時,如果某線程空閑時間超過keepAliveTime,線程將被終止。這樣,線程池可以動態(tài)的調整池中的線程數(shù)。
3. 示例代碼
Junit Test
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MultiThreadConfig.class })
public class MultiThreadTest {
@Autowired
private ThreadPoolTaskExecutor taskExecutor;
@Autowired
private MultiThreadProcessService multiThreadProcessService;
@Test
public void test() {
int n = 20;
for (int i = 0; i < n; i++) {
taskExecutor.execute(new MultiThreadDemo(multiThreadProcessService));
System.out.println("int i is " + i + ", now threadpool active threads totalnum is " + taskExecutor.getActiveCount());
}
try {
System.in.read();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
MultiThreadDemo
/**
* 多線程并發(fā)處理demo
* @author daniel.zhao
*
*/
public class MultiThreadDemo implements Runnable {
private MultiThreadProcessService multiThreadProcessService;
public MultiThreadDemo() {
}
public MultiThreadDemo(MultiThreadProcessService multiThreadProcessService) {
this.multiThreadProcessService = multiThreadProcessService;
}
@Override
public void run() {
multiThreadProcessService.processSomething();
}
}
MultiThreadProcessService
@Service
public class MultiThreadProcessService {
public static final Logger logger = Logger.getLogger(MultiThreadProcessService.class);
/**
* 默認處理流程耗時1000ms
*/
public void processSomething() {
logger.debug("MultiThreadProcessService-processSomething" + Thread.currentThread() + "......start");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
logger.debug("MultiThreadProcessService-processSomething" + Thread.currentThread() + "......end");
}
}
MultiThreadConfig
@Configuration
@ComponentScan(basePackages = { "com.xxx.multithread" })
@ImportResource(value = { "classpath:config/application-task.xml" })
@EnableScheduling
public class MultiThreadConfig {
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
springboot+thymeleaf+layui的實現(xiàn)示例
本文主要介紹了springboot+thymeleaf+layui的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-12-12
基于Rest的API解決方案(jersey與swagger集成)
下面小編就為大家?guī)硪黄赗est的API解決方案(jersey與swagger集成)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
Spring?session?redis?修改默認的序列化方法(案例)
這篇文章主要介紹了Spring?session?redis?修改默認的序列化方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04
Java中的ScheduledThreadPoolExecutor定時任務詳解
這篇文章主要介紹了Java中的ScheduledThreadPoolExecutor詳解,??ScheduledThreadPoolExecutor?繼承自?ThreadPoolExecutor,它主要用來在給定的延遲之后運行任務,或者定期執(zhí)行任務,ScheduledThreadPoolExecutor?的功能與?Timer?類似<BR>,需要的朋友可以參考下2023-12-12
如何使用mybatis-plus實現(xiàn)分頁查詢功能
最近在研究mybatis,然后就去找簡化mybatis開發(fā)的工具,發(fā)現(xiàn)就有通用Mapper和mybatis-plus兩個比較好的可是使用,可是經過對比發(fā)現(xiàn)還是mybatis-plus比較好,下面這篇文章主要給大家介紹了關于如何使用mybatis-plus實現(xiàn)分頁查詢功能的相關資料,需要的朋友可以參考下2022-06-06

