參數(shù)說明:
corePoolSize:線程池維護線程最小數(shù)量
maxPoolSize:線程池維護線程最大數(shù)量
keepAliveSeconds:(maxPoolSize-corePoolSize)部分線程空閑最大存活時間
queueCapacity:阻塞任務(wù)隊列
AllowCoreThreadTimeOut:設(shè)置為true的話,keepAliveSeconds參數(shù)設(shè)置的有效時間對corePoolSize線程也有效
RejectedExecutionHandler:當(dāng)提交任務(wù)數(shù)超過maxmumPoolSize+workQueue之和時,任務(wù)會交給RejectedExecutionHandler來處理
線程創(chuàng)建流程:
1.當(dāng)線程數(shù)量小于corePoolSize時,創(chuàng)建線程,不管線程是不是閑置的
2.當(dāng)線程數(shù)量大于等于corePoolSize時,把任務(wù)放到queueCapacity隊列
3.當(dāng)queueCapacity滿了,就創(chuàng)建新的線程來執(zhí)行
4.當(dāng)線程數(shù)量大于等于maxPoolSize時,根據(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個任務(wù),每個任務(wù)執(zhí)行需要花費6s,開啟最大12個線程
執(zhí)行完了之后,會有7個線程消亡(隨機的)
如果此時再調(diào)用此接口,會再新創(chuàng)建7個線程(名字與之前消亡的7個線程不一樣)
如果在線程消亡之前再次調(diào)用此接口,則還是使用當(dāng)前的12個線程