【问题标题】:How does Keep-alive work with ThreadPoolExecutor?Keep-alive 如何与 ThreadPoolExecutor 一起工作?
【发布时间】:2012-05-09 21:28:29
【问题描述】:

继续我发布的question,我正在尝试在我的代码库中使用ThreadPoolExecutor。即使在反复尝试从 Java API 文档中理解之后,我仍然无法清楚地理解 keepAliveTime 参数背后的功能/目的要在构造函数中传递。希望有人能用一些好的工作例子来解释我。

Java 文档节选:

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue)

keepAliveTime - 当线程数大于核心时,这是之前多余的空闲线程等待新任务的最长时间终止。

【问题讨论】:

  • 就术语而言,当我认为您只是指“使用”时,您已经两次使用了“实施”一词。您不是试图通过编写自己的代码来实现该 API 来实现 ThreadPoolExecutor - 您只是在创建一个 ThreadPoolExecutor 并且您想知道它的行为方式,对吧?
  • 是的,你是对的。我只是过去的意思是它是我代码库中的一种新实现。
  • 但这不是 ThreadPoolExecutor 的实现。如果您能恰当地使用术语,这真的很有帮助 - 尤其是在 Stack Overflow 上。
  • 确定。感谢您纠正我。

标签: java multithreading keep-alive


【解决方案1】:

假设您的核心大小为 5,最大大小为 15。由于某种原因,您的池变得繁忙,并使用了所有 15 个可用线程。最终你没有工作要做 - 所以你的一些线程在完成他们的最终任务时变得空闲。因此允许其中 10 个线程死亡。

但是,为了避免它们被过快杀死,您可以指定保持活动时间。因此,如果您将 1 指定为 keepAliveTime 值并将 TimeUnit.MINUTE 指定为 unit 值,则每个线程将在完成任务后等待一分钟,以查看是否还有更多工作要做。如果它仍然没有得到任何更多的工作,它会让自己完成,直到池中只有 5 个线程 - 池的“核心”。

【讨论】:

  • 如果我理解正确,keepAliveTime 仅在池中的线​​程超过核心大小时使用/有效。当池中的线程小于核心大小时,这适用。
  • 杀死线程的意义与首先拥有线程池的意义相同——不浪费不必要的资源。
  • @Gnanam - 这样线程可以执行另一个任务,从而节省创建新线程的开销。
  • @Gnanam:这当然也是我的理解。这并不是说它必然正确,但至少是一致的:)
  • @Prabhath:假设“等待网络调用”是指它正在进行网络调用并阻止它完成,那么不,它不是空闲的——它是阻塞的。如果它是空闲的,它可以被赋予另一个任务。如果它被阻止了,那就不可能了。
【解决方案2】:

以下是来自 Javadoc 的更多描述:

<dt>Keep-alive times</dt>
 *
 * <dd>If the pool currently has more than corePoolSize threads,
 * excess threads will be terminated if they have been idle for more
 * than the keepAliveTime (see {@link
 * ThreadPoolExecutor#getKeepAliveTime}). This provides a means of
 * reducing resource consumption when the pool is not being actively
 * used. If the pool becomes more active later, new threads will be
 * constructed. This parameter can also be changed dynamically
 * using method {@link ThreadPoolExecutor#setKeepAliveTime}. Using
 * a value of <tt>Long.MAX_VALUE</tt> {@link TimeUnit#NANOSECONDS}
 * effectively disables idle threads from ever terminating prior
 * to shut down.
 * </dd>
 *

本质上,这只是允许您控制空闲池中剩余的线程数。如果您将其设置得太小(对于您正在做的事情),您将创建太多线程。如果你让它太大,你将消耗你不需要的内存/线程。

【讨论】:

    【解决方案3】:

    这是代码示例,它演示了 keepAliveTime 的工作 How does maximumPoolSize of ThreadPoolExecutor works?

    【讨论】:

      猜你喜欢
      • 2015-05-30
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 2021-08-17
      • 2015-09-27
      • 2016-05-11
      • 2012-01-04
      • 1970-01-01
      相关资源
      最近更新 更多