参数说明:
corePoolSize:线程池维护线程最小数量
maxPoolSize:线程池维护线程最大数量
keepAliveSeconds:(maxPoolSize-corePoolSize)部分线程空闲最大存活时间
queueCapacity:阻塞任务队列
AllowCoreThreadTimeOut:设置为true的话,keepAliveSeconds参数设置的有效时间对corePoolSize线程也有效
RejectedExecutionHandler:当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理
线程创建流程:
1.当线程数量小于corePoolSize时,创建线程,不管线程是不是闲置的
2.当线程数量大于等于corePoolSize时,把任务放到queueCapacity队列
3.当queueCapacity满了,就创建新的线程来执行
4.当线程数量大于等于maxPoolSize时,根据RejectedExecutionHandler设置的策略来处理新加入的任务
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()+"--执行"+num+"--active:"+taskExecutor.getActiveCount()+"--poolSize:"+taskExecutor.getPoolSize());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
logger.info("end "+(System.currentTimeMillis()-start));
return "success";
}
执行500个任务,每个任务执行需要花费6s,开启最大12个线程
image.png
执行完了之后,会有7个线程消亡(随机的)
image.png
如果此时再调用此接口,会再新创建7个线程(名字与之前消亡的7个线程不一样)
如果在线程消亡之前再次调用此接口,则还是使用当前的12个线程
网友评论