參數(shù)說明:
corePoolSize:線程池維護(hù)線程最小數(shù)量
maxPoolSize:線程池維護(hù)線程最大數(shù)量
keepAliveSeconds:(maxPoolSize-corePoolSize)部分線程空閑最大存活時(shí)間
queueCapacity:阻塞任務(wù)隊(duì)列
AllowCoreThreadTimeOut:設(shè)置為true的話杉编,keepAliveSeconds參數(shù)設(shè)置的有效時(shí)間對(duì)corePoolSize線程也有效
RejectedExecutionHandler:當(dāng)提交任務(wù)數(shù)超過maxmumPoolSize+workQueue之和時(shí)手幢,任務(wù)會(huì)交給RejectedExecutionHandler來處理
線程創(chuàng)建流程:
1.當(dāng)線程數(shù)量小于corePoolSize時(shí)灿里,創(chuàng)建線程,不管線程是不是閑置的
2.當(dāng)線程數(shù)量大于等于corePoolSize時(shí)涩笤,把任務(wù)放到queueCapacity隊(duì)列
3.當(dāng)queueCapacity滿了,就創(chuàng)建新的線程來執(zhí)行
4.當(dāng)線程數(shù)量大于等于maxPoolSize時(shí)盒件,根據(jù)RejectedExecutionHandler設(shè)置的策略來處理新加入的任務(wù)
spring.task.pool.corePoolSize=5
spring.task.pool.maxPoolSize=12
spring.task.pool.keepAliveSeconds=100
spring.task.pool.queueCapacity=40
@RequestMapping("/bigData")
public String bigData(){
Long start = System.currentTimeMillis();
logger.info("big data start..");
for(int i=1;i<500;i++){
final int num = i;
taskExecutor.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000*6);
logger.info(Thread.currentThread().getName()+"--執(zhí)行"+num+"--active:"+taskExecutor.getActiveCount()+"--poolSize:"+taskExecutor.getPoolSize());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
logger.info("end "+(System.currentTimeMillis()-start));
return "success";
}
執(zhí)行500個(gè)任務(wù)蹬碧,每個(gè)任務(wù)執(zhí)行需要花費(fèi)6s,開啟最大12個(gè)線程
執(zhí)行完了之后炒刁,會(huì)有7個(gè)線程消亡(隨機(jī)的)
如果此時(shí)再調(diào)用此接口恩沽,會(huì)再新創(chuàng)建7個(gè)線程(名字與之前消亡的7個(gè)線程不一樣)
如果在線程消亡之前再次調(diào)用此接口,則還是使用當(dāng)前的12個(gè)線程