12

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

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

4

5 回答 5

10

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

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

总之:

allowCoreThreadTimeOut(true) // Could save memory compromising performance

allowCoreThreadTimeOut(false) // Comsume memory but high performance 
于 2013-08-14T07:41:58.527 回答
3

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

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

于 2018-02-21T15:26:18.137 回答
2
public void allowCoreThreadTimeOut(boolean value)

这在javadoc中有很好的解释

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

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

于 2013-08-14T07:42:11.753 回答
1

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

以下是ThreadPoolExecutor 文档的“最终化”部分中引用的这种场景:

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

于 2018-05-07T23:34:51.380 回答
-1

您可以检查 android sdk 的解析实现,这真的很好。

于 2015-10-20T21:38:41.730 回答