线程池ThreadPoolTaskExecutor 配置

2017-12-14  本文已影响436人  perfect_jimmy

参数说明:
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个线程

上一篇下一篇

猜你喜欢

热点阅读