美文网首页
线程池ThreadPoolTaskExecutor 配置

线程池ThreadPoolTaskExecutor 配置

作者: perfect_jimmy | 来源:发表于2017-12-14 18:03 被阅读436次

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

    相关文章

      网友评论

          本文标题:线程池ThreadPoolTaskExecutor 配置

          本文链接:https://www.haomeiwen.com/subject/dozkwxtx.html