【问题标题】:Java - Managing Size of Thread Pool (Increasing mostly)Java - 管理线程池的大小(主要增加)
【发布时间】:2012-04-07 06:13:36
【问题描述】:

我正在尝试在 Java 中使用线程池。但是线程的数量是未知的,所以我试图找到一个解决方案。然后出现了两个问题:

  1. 一段时间以来,我一直在寻找增加线程池大小的方法,但我还没想出什么办法。对此有什么建议吗?有人说Executors.newCachedThreadPool() 应该可以工作,但在方法的定义中它说它适用于短时间线程。

  2. 如果我将线程池的大小设置为 50 或 100 这样的大数字会怎样?效果好吗?

【问题讨论】:

  • 您是否尝试过使用 JConsole 监控您的 JVM?
  • @AmitBhargava 不,我没有尝试,我现在只是在做一些研究。

标签: java threadpool


【解决方案1】:
  1. 您也可以将 Executors.newCachedThreadPool 用于更长寿的任务,但问题是,如果您有长时间运行的任务,并且它们的添加频率比现有任务的完成频率更高,那么数量的线程将失去控制。在这种情况下,最好使用(更大的)固定大小的线程池,让更多任务在队列中等待空闲线程。

  2. 这仅意味着您将(可能)有很多活动线程大部分时间都在休眠(空闲)。基本上要考虑的事情是

    • 您的系统可以处理多少个线程(即总共可以创建多少个线程,在 Windows 机器中这可能少于 1000 个,在 Linuces 中您可以获得数万个线程,甚至更多)系统配置)
    • 每个线程在内存方面至少消耗单个线程的堆栈大小(在 Linux 中,默认情况下,这可能是每个线程 1-8MB,同样可以通过 ulimits 和 JVM 的 -Xss 进行调整 -参数)
    • 至少对于 NPTL,休眠线程的上下文切换损失应该最小或几乎为零,因此多余的线程在 CPU 使用方面不会“沉重”

话虽如此,最好直接使用ThreadPoolExecutor 的构造函数来获得所需的池。

【讨论】:

  • 在第二个解决方案中,我必须在开始时填充池吗?因为在大多数情况下,工作线程的数量将低于最大尺寸。
  • 我不确定我理解你所说的“填充”池是什么意思。 ThreadPoolExecutor 具有方法 prestartAllCoreThreads(),它启动“corePoolSize”数量的线程。否则,池将根据 ThreadPoolExecutors 的 JavaDoc(答案中的链接)中记录的条件启动一个新线程。
  • 例如,我将大小设置为 50,我必须将 50 个线程添加到池中还是可以正常工作,比如说 10 个线程?在您说会有很多活动但空闲的线程之后,我想知道这一点。可能它会起作用,但我只想确定:)
  • 一个固定大小的线程池会在你每次向它提交任务时创建一个新线程,直到它创建了给定数量的线程。之后,它将重用现有线程并将任何没有可用线程的任务立即排队。我认为我们说的是同一件事,但使用不同的术语,您不会将线程 (java.lang.Thread) 提交到池中,而是将 Runnables (java.lang.Runnable -implementations) 或 Callables (java.util. concurrent.Callable -implementations),并且池将根据需要为您创建线程。
【解决方案2】:

Executors.newCachedThreadPool() 允许您按需创建线程。我认为你可以从使用它开始 - 我看不出它在哪里声明它是用于短时间线程的,但我敢打赌,原因是因为你正在重用可用线程,拥有短线程可以让你保持同时活动的数量线程很低。

除非您运行的线程太多(您可以使用 JVisualVM 或 JConsole 检查它),否则我建议您坚持使用该解决方案 - 特别是因为未定义预期线程的数量。然后分析 VM 并相应地调整您的池。

对于问题 2 - 您指的是使用 Executors.newFixedThreadPool(int) 之类的东西吗?如果是,请记住,超过您在创建 ThreadPool 时定义的线程数将使线程等待 - 而不是动态创建新线程的 newCachedThreadPool

【讨论】:

  • 我知道线程会等待,谢谢。我想知道当我使用第二种解决方案时是否会出现问题。
  • @mtyurt 是的,您可以通过使用第二种解决方案(数十或数百个大型线程池)引起问题。如果池中的那些线程受 CPU 限制(忙于计算而不是等待存储 I/O 或网络活动),那么context-switching 的成本可能会变得繁重且适得其反。我所说的适得其反的意思是,随着真正富有成效的工作越来越少,整体性能会下降。这个答案正确地指出您的任务可以排队等待。等待意味着没有工作,没有上下文切换。
猜你喜欢
  • 2016-12-19
  • 1970-01-01
  • 2022-12-29
  • 2021-09-15
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-20
相关资源
最近更新 更多