62

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

Java文档的摘录:

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

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

4

3 回答 3

96

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

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

于 2012-04-30T06:22:12.267 回答
6

以下是来自 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>
 *

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

于 2012-04-30T06:22:35.427 回答
0

这是代码示例,它演示了keepAliveTime的工作 ThreadPoolExecutor 的 maximumPoolSize 是如何工作的?

于 2016-07-27T14:36:22.400 回答