ThreadPoolExecutor中allowCoreThreadTimeout()的用途是什么?

时间:2013-08-14 07:31:06

标签: java android threadpoolexecutor

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

我读过Java& Android文档相关。 但是我没有得到任何有用的方法实现方案。 有人可以帮帮我吗?

6 个答案:

答案 0 :(得分:7)

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

当您创建线程池并且池中存在线程时,即使没有任务正在运行。保持这些线程活着是很昂贵的。如果你想在没有任务执行的情况下获得这些方法,那么这种方法很有用。你需要传递真正的价值,然后他们会在保持活着的时候死去。

摘要:

allowCoreThreadTimeOut(true) // Could save memory compromising performance

allowCoreThreadTimeOut(false) // Comsume memory but high performance 

答案 1 :(得分:1)

public void allowCoreThreadTimeOut(boolean value)

javadoc

对此进行了详细解释
  

设置控制核心线程是否超时的策略,如果没有任务在保持活动时间内到达,则在新任务到达时根据需要进行替换。

     

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

答案 2 :(得分:1)

允许核心线程超时允许应用程序有效地处理' bursty'交通。考虑一种情况,即企业应用程序在工作时间处于空闲状态,但在一天结束时会收到大量请求。

有效处理此方案的一种方法是启用allowCoreThreadTimeout()并将coreThreads = maxThreads设置为适当的高值。在该高峰时间内,您的线程池将向上扩展以处理流量,然后缩减回零,从而释放服务器资源。

答案 3 :(得分:0)

你可以查看parse implementation获取android sdk,这真的很不错。

答案 4 :(得分:0)

在您无法在对象生命周期结束时明确调用ThreadPoolExecutor.shutdown方法的情况下,它非常有用(框架并未提供" onClose" hook,例如),但您需要使用ThreadPoolExecutor。在这种情况下,如果没有allowCoreThreadTimeout(true)方法调用,ThreadPoolExecutor的核心线程将阻止对象的GC并导致内存泄漏。

此处"最终确定" ThreadPoolExecutor documentation的部分:

  

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

答案 5 :(得分:-1)

如果要在指定的超时时间后终止核心池线程,则应使用allowCoreThreadTimeout(true)。

请从文档中查看以下链接:

Android API Docs - ThreadPoolExecutor

当你真的处于低内存条件下时,你应该将true传递给这个方法。