Spring ThreadPoolTask​​Executor 的工作原理

2024-03-24

我一直在阅读 Spring 的 ThreadPoolTask​​Executor 的设置如何协同工作以及线程池和队列如何工作。This https://stackoverflow.com/a/43874563/10727434stackoverflow 的答案以及this https://www.baeldung.com/thread-pool-java-and-guava and this https://www.baeldung.com/java-threadpooltaskexecutor-core-vs-max-poolsizeBaeldung 的文章对我很有用。

据我所知,到目前为止,corePoolSize 线程数始终保持活动状态(假设allowCoreThreadTimeOut 未设置为true)。如果所有这些线程当前都在使用中,则任何其他请求都将放入队列中。一旦达到queueCapacity,线程池大小将增加,直到达到maxPoolSize。

直觉上,我本以为它会按如下方式工作:
corePoolSize 线程数量始终保持活动状态(再次假设 allowedCoreThreadTimeOut 未设置为 true)。如果所有这些线程当前都在使用并且有新请求进来,则池大小将增加,直到达到 maxPoolSize。如果还有更多请求进来,它们将被放入队列中,直到达到queueCapacity。

我想知道它以这种方式工作背后的原因是什么?


您应该检查的第一个参考是文档。

直接从文档中ThreadPoolExecutor https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ThreadPoolExecutor.html (ThreadPoolTaskExecutor“只是”一个包装器):

ThreadPoolExecutor 将根据 corePoolSize(请参阅 getCorePoolSize())和 maxPoolSize(请参阅 getMaximumPoolSize())设置的边界自动调整池大小(请参阅 getPoolSize())。当在方法execute(Runnable)中提交新任务时,如果运行的线程少于corePoolSize,则会创建一个新线程来处理该请求,即使其他工作线程处于空闲状态。否则,如果正在运行的线程少于 maxPoolSize,则仅当队列已满时才会创建一个新线程来处理请求。 [...]

如果池当前拥有超过 corePoolSize 的线程,则多余的线程如果空闲时间超过 keepAliveTime(请参阅 getKeepAliveTime(TimeUnit)),将被终止。这提供了一种在池未被积极使用时减少资源消耗的方法。如果池稍后变得更加活跃,则会构造新线程。 [...]

(你还没有提到的参数BlockingQueue但我建议您也阅读一下。这很有趣。)

为什么这些参数不能像您建议的那样工作?

如果池大小增加到maximumPoolSize在任务排队之前(就像您建议的那样),您会遇到一个问题:您已经删除了线程池确定的能力when一个新工人是值得的。

The corePoolSize是工人的数量stay在游泳池。好处是您不必为给定的工作负载创建、终止、创建、终止、创建……新工作线程。如果你能确定有多少工作量always是,设置corePoolSize因此。

The maximumPoolSize确定池中工人的最大数量。您希望对此进行控制,因为您可以拥有多个线程池、硬件限制或只是一个不需要那么多工作人员的特定程序。

现在为什么工作队列首先被填满?因为队列容量是一个指标when工作量如此之大,以至于值得去创造新的工人。只要队列未满,核心工作人员就应该足以处理给定的工作。如果达到容量,则会创建新的工作人员来处理进一步的工作。

通过这种机制,线程池动态创建工人when需要他们,而且只能保留尽可能多的工人usually需要。这就是线程池的要点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring ThreadPoolTask​​Executor 的工作原理 的相关文章

随机推荐

  • MySql::存储过程递归

    我如何重写以下 SP 来面对 MySQL 中的递归限制 CREATE DEFINER root localhost PROCEDURE SP DeleteParentDirectory pParentID INT pIsFolder INT
  • 阻止所有键盘访问、鼠标访问和键盘快捷键事件

    为了阻止我的项目之一中的所有键盘访问 鼠标访问和键盘快捷键事件 我 创建了一个全屏透明无边框窗口 在其他窗口前面 但不可见 用简单的方式处理所有键盘和鼠标事件return 窗户本身 使window modal NSApp runModalF
  • 在 Xamarin Forms for iOS 上向编辑器底部添加边框

    目前 我的 Xamarin 表单应用程序中有输入字段 这些输入字段在 iOS 上只有底部边框 可以使用以下自定义渲染器完美运行 using Xamarin Forms Platform iOS using Xamarin Forms usi
  • 当我使用 ACTION_IMAGE_CAPTURE 拍照时出现 NullPointerException

    我有一个相当简单的应用程序 可以从菜单启动相机 相机启动正常 但是当我拍照后点击 确定 时 我的 Nexus 上出现了 NPE E AndroidRuntime 3891 java lang RuntimeException Failure
  • 验证 C# Winforms 上文本框的输入

    我正在尝试验证 C winforms 上文本框的输入是否符合有效模式 模式必须是仅包含以下字符的字符串 0 to 9 A to Z 我正在考虑使用文本框上的 验证 事件来执行验证 但我正在努力使用正确的正则表达式 或者也许有比使用正则表达式
  • vba正则表达式仅返回第一个匹配项

    我在 VBA WORD 中的正则表达式匹配仅给出一个结果 我创建了这个函数 Function RE6 strData As String As String Dim RE As Object REMatches As Object Set
  • React-native-paper 的复选框中出现了奇怪的十字

    I am using a checkbox from react native paper library but when I render that checkbox in my component a strange special
  • Maven 继承和聚合示例架构

    我有一个问题 关于如何使用继承和聚合的组合最好地重新构建多个单独的 Maven 项目 设置场景 有 3 个基于代码的现有 Maven 项目 全部由同一团队开发 1 项目是一个API 我们调用的是project api 另外 2 个项目是使用
  • 给定项目句柄,获取 Canvas 小部件上项目的当前坐标?

    通过阅读文档 http effbot org tkinterbook canvas htm reference http effbot org tkinterbook canvas htm reference 在我看来没有办法做到这一点 只
  • 运行比内核数量更多的分区是否有意义?

    鉴于 Spark 任务数量不能高于核心数量 运行比核心数量更多的分区是否有意义 如果是这样 您能详细说明一下吗 正如您提到的 您需要至少 1 个任务 核心才能利用所有集群的资源 根据每个阶段 任务所需的处理类型 您可能会遇到处理 数据倾斜
  • 如何在单个 mysql 查询中连接多个关系表中的多个值

    我的 旅行优惠 项目有一个大问题 99 正常 但不是 100 我有一个包含报价的主表 其中每个报价可以设置多个部门城市以及多个目的地城市 这是减少列的减少样本 例如 我提供一些从英格兰出发的旅行 其中部门城市可以是伦敦 利兹和曼彻斯特 目的
  • Android 无法捕获 NullPointerException

    我的应用程序中有一个非常烦人的 NPE 但找不到解决方案 首先是堆栈跟踪 09 12 23 27 32 855 ERROR AndroidRuntime 19152 java lang NullPointerException 09 12
  • 为了确保数值稳定性,scipy.signal.deconvolve 的除数参数有哪些限制?

    这是我的问题 我将处理来自系统的数据 我将很好地了解该系统的脉冲响应 之前使用 Python 进行过一些基本脚本编写 我开始了解 scipy signal convolve 和 scipy signal deconvolve 函数 为了对我
  • 哲学家就餐实施[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我只是想知道这是否可以解决java中的哲学家就餐问题 import java util concurrent locks Lock import ja
  • Scala self 类型和集合中的 this.type 问题

    我试图理解 scala 中抽象和显式的自我类型 让我们考虑这个例子 我想为可扩展树创建一个基础 就像这样简单 trait Tree def children Iterable Tree def descendants Iterable Tr
  • 如何在 Fluent NHibernate 中将“级联删除”选项设置为“设置空”?

    我是 Fluent nHibernate 的新手 想知道 如果我有两个类 Profile 和 Email 一对多映射 如下所示 我想流畅地定义一个 nHibernate 映射 这样当 Profile 被删除时 Email 将保留在DB 键设
  • 从 Android 加速度计获取倾斜角度

    我有一个实现的类SensorEventListener我想得到 这tilt Angle我的设备使用Accelerometer 我在互联网上寻找示例 但他们使用Sensor TYPE MAGNETIC FIELD 我相信我的设备没有这个传感器
  • 我解释 DI 和 IoC 的方式有什么问题?

    昨天在一次采访中我被问到春季的 DI 和 IoC 是什么 我的回复是 when a class A 延伸摘要class B 或实施interface B 或创建一个对象class B 其中任何一个类 那么A据说是 依赖于B 注入这个依赖关系
  • winforms:使用parallel.foreach更新进度

    我没有看到任何与我的问题相关的帖子 因此 如果我发布已经提出的问题 我深表歉意 我有一个 Windows 窗体程序 C 用于检查股票并进行分析 主窗体通过新线程和 ShowDialog 启动另一个窗体 当它加载时 它正在运行parallel
  • Spring ThreadPoolTask​​Executor 的工作原理

    我一直在阅读 Spring 的 ThreadPoolTask Executor 的设置如何协同工作以及线程池和队列如何工作 This https stackoverflow com a 43874563 10727434stackoverf