线程池任务执行器

时间:2019-09-23 11:14:53

标签: java spring multithreading spring-boot threadpoolexecutor

为什么无论现有线程是否空闲,Spring的ThreadPoolTask​​Executor都继续创建最大为Core Size值的线程!

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

我一一触发了请求,并一直增加线程数量,直到达到300。我的问题是现有线程是否空闲,为什么不使用空闲线程?一旦达到核心池大小,就只能使用池中的线程。

enter image description here

2 个答案:

答案 0 :(得分:2)

根据Java文档here

,Spring在这里要做的事情很少
  

在方法execute(Runnable)中提交新任务时,更少   当corePoolSize线程正在运行时,将创建一个新线程来   处理请求,即使其他工作线程处于空闲状态也是如此。如果有   大于corePoolSize但小于maximumPoolSize线程   正在运行,仅当队列已满时才会创建新线程

答案 1 :(得分:1)

核心线程池大小指定要准备处理任何潜在工作以避免创建新线程的开销的线程数。指定300要求一个始终保持300个线程的线程池,您不应期望它在满足数量之前就可以重用。如果此值太高,请考虑在保持相同的maxPoolSize的同时减小corePoolSize,当池超载时,它会放大。 在不使用时,请查看ThreadPoolTask​​Executor的setAllowCoreThreadTimeOut以将线程池​​缩小到corePoolSize以下。

相关问题