【问题标题】:What is the use of allowCoreThreadTimeout( ) in ThreadPoolExecutor?ThreadPoolExecutor 中的 allowCoreThreadTimeout() 有什么用?
【发布时间】:2013-08-16 01:09:00
【问题描述】:

我必须在我的 Android 组件之一中使用 Java ThreadPoolExecutor。我正在搜索 allowCoreThreadTimeout( ) 的用法。

我已阅读相关的 Java 和 Android 文档。 但是我没有得到该方法的任何有用的实现场景。 有人可以帮帮我吗?

【问题讨论】:

  • 我想如果有人可以想象一个场景,减少空闲线程是有益的,那么这将是一个用例。也许如果您有一个非常大的线程池(以处理最坏的情况),但您不希望始终保持 100 多个线程处于活动状态。

标签: java android threadpoolexecutor


【解决方案1】:

此方法允许您指定如果在线程保持活动时间内没有传入任务,是否终止核心线程。这与其他配置有关,例如 setCorePoolSize()、setKeepAliveTime(..)

当您创建线程池时,即使没有任务正在运行,池中也存在空闲线程。保持这些线程活着是很昂贵的。如果您想在没有要执行的任务时摆脱这些,此方法很有用。您需要传递真实值,然后它们将在保持活动时间后死亡。

总结:

allowCoreThreadTimeOut(true) // Could save memory compromising performance

allowCoreThreadTimeOut(false) // Comsume memory but high performance 

【讨论】:

  • 我认为 OP 正在询问您可能想要执行此操作的场景。
  • @Shamim Ahmed 我知道这一点。它在文档中提到。但我想了解实施方案?
  • @Shamim Ahmed 应该考虑什么:高性能或内存消耗
  • 高性能:不会创建新线程,重用现有线程。所以它更快。但是线程会占用虚拟机堆(内存)
【解决方案2】:
public void allowCoreThreadTimeOut(boolean value)

这在javadoc中有很好的解释

设置控制核心线程是否可以超时并在保持活动时间内没有任务到达时终止并在新任务到达时根据需要替换的策略。

当为 false 时,核心线程永远不会因为缺少传入任务而终止。当为 true 时,适用于非核心线程的相同保活策略也适用于核心线程。 为避免连续的线程替换,设置为 true 时保活时间必须大于零。此方法通常应在池被主动使用之前调用。

【讨论】:

  • 我认为 OP 正在询问您可能想要执行此操作的场景。
  • @Tala 我已经提到我已经阅读了文档。问题是我不明白如何实现它。另外,您能否说明一下“在新任务到达时根据需要更换”。
【解决方案3】:

你可以查看parse implementation 的android sdk,真的很好。

【讨论】:

    【解决方案4】:

    允许核心线程超时允许应用程序有效地处理“突发”流量。考虑一个企业应用程序在工作时间空闲但在一天结束时收到大量请求的场景。

    有效处理这种情况的一种方法是启用allowCoreThreadTimeout() 并将coreThreads = maxThreads 设置为某个适当的高值。在那个高峰时间,您的线程池将扩大以处理流量,然后缩小到零,从而释放服务器资源。

    【讨论】:

      【解决方案5】:

      当您无法在对象生命周期结束时显式调用ThreadPoolExecutor.shutdown 方法时(例如,框架不提供“onClose”挂钩),它很有用,但您需要使用ThreadPoolExecutor。这种情况下,如果没有allowCoreThreadTimeout(true)方法调用,ThreadPoolExecutor的核心线程会阻塞你的对象的GC,导致内存泄漏。

      这是ThreadPoolExecutor documentation 的“最终确定”部分中引用此方案的方式:

      一个不再在程序中引用并且没有剩余的池 线程将自动关闭。如果您想确保 即使用户忘记调用未引用的池也会被回收 shutdown(),那么你必须安排未使用的线程最终死掉, 通过设置适当的保持活动时间,使用零下限 核心线程和/或设置 allowCoreThreadTimeOut(boolean)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-29
        • 2023-03-16
        • 2018-06-06
        • 2011-11-25
        • 1970-01-01
        • 2016-05-23
        相关资源
        最近更新 更多