【问题标题】:Lightweight, collapsible Executor implementation?轻量级、可折叠的 Executor 实现?
【发布时间】:2011-02-22 19:52:30
【问题描述】:

我正在为 Android 构建一个移动应用程序,我需要为我的每个 List 适配器汇集 HTTP 请求。我基本上想要一个“折叠”的ExecutorService 实现,即:它将使用多达 n 个线程,但随着线程完成,它们将立即过期,使其非常轻量级。如果需求量很大,它只会将任务转储到等待线程可用的队列中。有没有办法在不写ExecutorService自己的情况下做到这一点,还是我应该把手弄脏然后去做?

【问题讨论】:

  • Android 没有提供类似于 java.util.concurrent.ThreadPoolExecutor 的执行器,这让我感到很惊讶。请注意,编写一个好的和线程安全的执行器比看起来更难 - 我知道,我已经为 Java 1.1 做到了。
  • 没有人再搜索文档了吗?我为“Android Executor”做了一个简单的谷歌搜索,并在developer.android.com/reference/java/util/concurrent/… 的文档中被第一次点击,该文档直接链接到各种执行器,包括 ThreadPoolExecutor。

标签: java android executorservice executor


【解决方案1】:

使用 ThreadPoolExecutor 并将其 keepAliveTime 设置为零是否有效?

例如

int core = 5;
int max = 20;
new ThreadPoolExecutor(core, max, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>())

来自setKeepAliveTime() 的文档:

时间值为零会导致多余的线程在执行任务后立即终止。

【讨论】:

  • 太棒了,谢谢。所以像new ThreadPoolExecutor(0, 8, TimeUnit.SECONDS, new LinkedBlockingQueue&lt;Runnable&gt;()) 这样的东西会给我一个最小大小为0,最大大小为8的池,并在线程完成后杀死线程?还是因为超时,在这种情况下第一个参数或多或少无关紧要?
  • 使用 0 和 8,池最初会分配 0 个线程。当一个任务被提交给执行器时,如果没有可用的线程,它会分配一个新的线程来处理它。最多可以分配 8 个并发线程,并且在所有 8 个线程都被使用时提交的任何内容都将简单地保留在队列中,直到执行程序可用为止。我不确定的一件事是线程是否会在从队列中获取下一个任务(如果可用)之前终止。在没有文件另有说明的情况下,我倾向于相信它会。
  • 对于它的价值,我不建议核心池大小为 0 以及 keepAliveTime 为 0。在我看来,您的线程将不断被终止/重建,这将否定您要追求的“轻量级”标准。我无法想象有几个核心线程在后台等待会使您的应用程序陷入困境。与任何性能问题一样,编写您的代码,然后分析您的应用程序以查看它是否按照您需要的方式运行。如果不是,请重构。
  • FWIW:如果实现让线程在队列上有任务时死掉,我会感到震惊,只是为了创建另一个线程来接管死掉的线程 - 这将更加困难实施。
  • keep-alive 时间记录为与空闲时间有关:excess threads will be terminated if they have been idle for more than the keepAliveTime,这似乎可以防止线程在有待处理任务时终止。然而,allowCoreThreadTimeout 的文档似乎表明相反:To avoid continual thread replacement, the keep-alive time must be greater than zero when setting true
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
相关资源
最近更新 更多