Keep-alive如何与ThreadPoolExecutor一起工作?

时间:2012-04-30 06:17:43

标签: java multithreading keep-alive

继续发布我发布的question,我正在尝试在代码库中使用ThreadPoolExecutor。即使在多次尝试从Java API doc中理解之后,我也无法清楚地理解在构造函数中传递keepAliveTime参数背后的功能/目的。希望有人可以用一些好的工作实例来解释我。

摘自Java doc:

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

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

3 个答案:

答案 0 :(得分:61)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

以下是代码示例,演示 keepAliveTime 的工作 How does maximumPoolSize of ThreadPoolExecutor works?