线程池任务执行器

为什么 Spring 的 ThreadPoolTaskExecutor 不断创建达到 Core Size 值的线程,无论现有线程是否空闲!

    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(300);
    executor.setMaxPoolSize(500);
    executor.setQueueCapacity(5000);
    executor.setThreadNamePrefix("AsyncTask-");
    executor.initialize();

我一个接一个地发出请求,它不断增加线程数量,直到达到 300。我的问题是,如果现有线程空闲,为什么它不使用空闲线程?一旦达到核心池大小,无论如何仅使用池中的线程。

https://img.mukewang.com/64dc981400013e0106510268.jpg

侃侃尔雅
浏览 99回答 2
2回答

aluckdog

根据 java 文档,Spring 在这里要做的事情较少当在方法execute(Runnable)中提交新任务并且正在运行的线程少于corePoolSize时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求。如果运行的线程数大于 corePoolSize 但小于 MaximumPoolSize,则仅当队列已满时才会创建新线程

墨色风雨

核心线程池大小指定要保持准备状态以处理任何潜在工作的线程数量,以避免创建新线程的开销。指定 300 是要求线程池始终维护 300 个线程,您不应该期望它在满足该数量之前重用。如果这个值太高,请考虑减少 corePoolSize,同时保持 maxPoolSize 不变,当池过载时,它会扩大。查看 ThreadPoolTaskExecutor 的setAllowCoreThreadTimeOut在不使用时将线程池缩小到 corePoolSize 以下。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java