当前位置: 首页 > 知识库问答 >
问题:

保持活力如何与ThreadPoolExector一起工作?

戴靖
2023-03-14

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

Java文档节选:

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

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

共有3个答案

贝礼骞
2023-03-14

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

那利
2023-03-14

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

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

督坚白
2023-03-14

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

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

 类似资料:
  • 创建美丽,有用,聪明的东西的欲望能高度调动程序员的积极性。这是奇妙而令人惊奇的。这种欲望对程序员既不特殊也不普遍,但在程序员中,它是如此强烈而普遍以至于它把程序员与其他角色的人们分割开来。 这有一个现实而重要的推论。如果当程序员被要求做一些既不美丽,也没有用,也不漂亮的事情,他们会斗志低落。虽然可以通过做丑陋的,愚蠢的,无聊的东西赚很多的钱,但最后,乐趣才会为公司赚最多的钱。 很明显,有一些完全由

  • 问题内容: 我正在使用POST方法。我需要创建一次,并且应该使用Keep Alive Connection。但是我认为,它每次都会建立一个新的连接。 因此,我需要使用 保持活动 连接。 这是我的代码段,很多帮助将不胜感激。 而且logcat日志是: 问题答案: 10:07:29.746:D / org.apache.http.headers(1529):>>连接:保持活动 您正在要求保持活动状态。

  • 错误代码:2013。查询期间与MySQL服务器的连接中断 我正在使用MySQL工作台。另外,我正在运行一批插入,总共大约1000行(例如,乘以1000次),每批需要相当长的时间,其中一些时间超过600秒。 如何配置workbench,以便在不停止和不丢失连接的情况下继续通宵工作?

  • 问题内容: 继续我提出的问题,我试图在我的代码库中使用ThreadPoolExecutor。即使反复尝试从Java API文档中理解,我也无法清楚地理解keepAliveTime要在构造函数中传递的参数的功能/目的。希望有人可以通过一些很好的例子向我解释。 Java文档摘录: keepAliveTime-当线程数大于内核数时,这是多余的空闲线程将在终止之前等待新任务的最长时间。 问题答案: 假设您

  • 我想知道是否有人可以帮助我理解如何将转换表合并到Hypermax算法中。任何示例、伪代码、技巧或实现参考都将不胜感激! 一点背景: Hypermax是一种递归游戏树搜索算法,用于n人游戏,通常用于3人游戏。它是最小最大和α-β修剪的扩展 通常,在游戏树中的每个节点,当前玩家(选择者)将查看其可以做出的所有移动,并选择一个最大化其自身效用的移动。不同于最小值/最大值 我理解换位表是如何工作的,但我不

  • 我已经在Angular 2上使用ImmutableJS有一段时间了,因为它在变化检测方面的性能优势。看这里。 然而,我不太清楚,为什么Immutable在默认情况下与Angular 2一起工作。当没有显式数组时,它如何知道如何迭代值并显示它们?它是否每次访问集合的值时都调用?它实现了Angular 2自动调用的某种方法吗? 如果是这样的话,有没有一种方法可以定义您自己的集合来实现这个方法? 例如: