我必须在Android的某个组件中使用Java ThreadPoolExecutor。我正在搜索allowCoreThreadTimeout()的使用。
我读过Java& Android文档相关。 但是我没有得到任何有用的方法实现方案。 有人可以帮帮我吗?
答案 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)
对此进行了详细解释
设置控制核心线程是否超时的策略,如果没有任务在保持活动时间内到达,则在新任务到达时根据需要进行替换。
如果为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传递给这个方法。