gpt4 book ai didi

java - 线程池执行器 : Tasks are getting queued up and not submitted

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:18 24 4
gpt4 key购买 nike

我们有一个场景,提交给 ThreadPoolExecutor 的任务是长时间运行的。当线程池启动时,我们以核心池大小 = 5、最大池大小 = 20 和队列大小 10 启动它。在我们的应用程序中,大约有 10 个任务被提交。大多数情况下,这些任务运行几分钟/小时,然后完成。然而,有一种情况是所有 5 个任务都在 I/O 上挂起。结果我的核心池大小达到了最大值,但我的 Threadpoolexecutor 队列未满。所以额外的 5 个任务从来没有机会运行。请建议我们如何处理这种情况?在这种情况下,队列越小越好吗?初始化 threadPool 时最佳队列大小是多少?

还有关于挂起的任务,有没有什么办法可以把线程从线程池中拉出来?在那种情况下,至少其他任务将有机会运行。

最佳答案

整体情况是这样的:

core pool size = 5,
max pool size = 20 and
queue size of 10

提交了 10 个任务。其中

  1. 5 个任务在 I/O 上挂起 => 核心池大小的所有线程都被占用。因此没有空闲线程。
  2. 还有 5 项任务。这5个线程入队是因为没有空闲线程,队列可以容纳10个任务。在队列已满或核心池中的任何线程空闲之前,这些排队的任务将不会执行。

因此,您的程序被挂起。

要了解有关 ThreadPoolExecutor 动态的更多信息,请观看 here .该文档的显着点如下:

  • 如果运行的线程少于 corePoolSize,执行器总是倾向于添加新线程而不是排队。
  • 如果 corePoolSize 或更多线程正在运行,Executor 总是更喜欢排队请求而不是添加新线程。
  • 如果请求无法排队,则会创建一个新线程,除非这会超过 maximumPoolSize,在这种情况下,任务将被拒绝。

编辑
如果你想增加核心池大小,那么你可以使用 setCorePoolSize(int corePoolSize) 。如果您增加 corepoolsize,那么如果需要,将启动新线程来执行任何排队的任务。

关于java - 线程池执行器 : Tasks are getting queued up and not submitted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15032412/

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