gpt4 book ai didi

java - Spring的ThreadPoolTask​​Executor的池大小问题

转载 作者:IT老高 更新时间:2023-10-28 13:49:05 25 4
gpt4 key购买 nike

我正在对我的 Spring 应用程序进行一些负载测试,现在我对 ThreadPoolTask​​Executor 的配置有点困惑。

内部使用的 ThreadPoolExecutor 的文档将 corePoolSize 描述为“保留在池中的线​​程数,即使它们是空闲的,[...] "和 maximumPoolSize 为“池中允许的最大线程数”。

这显然意味着 maximumPoolSize 限制了池中的线程数。但相反,限制似乎是由 corePoolSize 设置的。实际上我只用 100 配置了 corePoolSize 并让 maximumPoolSize 未配置(这意味着使用默认值:Integer.MAX_VALUE = 2147483647).

当我运行负载测试时,我可以看到(通过查看日志),执行的工作线程从 worker-1worker-100 编号。所以在这种情况下,线程池的大小受 corePoolSize 的限制。即使我将maximumPoolSize设置为200300,结果也完全一样。

为什么 maximumPoolSize 的值对我没有影响?

@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(100);
taskExecutor.setThreadNamePrefix("worker-");
return taskExecutor;
}

解决方案

我在文档中找到了解决方案:“如果运行的线程数多于 corePoolSize 但少于 maximumPoolSize,则仅当队列已满时才会创建一个新线程”。默认队列大小为 Integer.MAX_VALUE。如果我限制队列,一切正常。

最佳答案

我对ThreadPoolTask​​Executor做了一些测试,你要明白三件事:

  • corePoolSize
  • 队列容量
  • 最大池大小

当您启动进程时,池中没有线程。每次任务到来时,只要未达到 corePoolSize,就会创建一个新的执行线程来处理这个新的负载。当 corePoolSize 达到时,下一个任务将转移到队列并等待一个空闲的执行线程。如果负载太高且 queueCapacity 已满,除非达到 maxPoolSize,否则将创建新的执行线程。一旦队列为空,这些额外的线程就会过期。如果 corePoolSize 用尽,queueCapacity 已满且 maxPoolSize 也达到,则新提交的任务将被拒绝并调用将得到异常。

您没有提到配置的 queueCapacity,因此它可能被设置为最大整数,因此永远不会触发 maxPoolSize。尝试使用小的 corePoolSizequeueCapacity,您将观察到所需的结果。

关于java - Spring的ThreadPoolTask​​Executor的池大小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32157817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com