线程池任务执行器

3
为什么Spring的ThreadPoolTaskExecutor会不断创建线程,直到达到核心大小值,即使现有的线程是空闲的!
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(300);
    executor.setMaxPoolSize(500);
    executor.setQueueCapacity(5000);
    executor.setThreadNamePrefix("AsyncTask-");
    executor.initialize();

我逐个发送请求并不断增加线程数,直到达到300。我的问题是,如果现有的线程处于空闲状态,为什么它不使用空闲的线程?一旦核心池大小达到,它仍然只使用池中的线程。

enter image description here


3
由于线程池将创建与核心池大小相等的线程数量,当达到核心池大小时,它将重用线程;如果所有核心池中的线程都忙碌,则会创建新的线程,直到达到最大池大小。 - undefined
你用什么工具得到了上面显示活跃线程数量的图表? - undefined
2个回答

4

根据Java文档 这里,Spring在这里的作用不大。

当通过方法execute(Runnable)提交一个新任务并且少于corePoolSize个线程正在运行时,会创建一个新线程来处理该请求,即使有其他工作线程处于空闲状态。如果正在运行的线程数超过corePoolSize但不到maximumPoolSize,只有队列已满时才会创建新线程。


2
核心线程池大小指定了要保持准备处理任何潜在工作的线程数量,以避免创建新线程的开销。指定300表示请求一个线程池,始终保持300个线程,直到达到该数字之前不应该期望重用线程。如果这个值太高,请考虑减少corePoolSize,同时保持相同的maxPoolSize,当池超载时它会自动扩展。 查看ThreadPoolTaskExecutor的setAllowCoreThreadTimeOut,可以在不使用时将线程池缩小到corePoolSize以下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接