【问题标题】:one Thread Pool for my whole android application我的整个 android 应用程序的一个线程池
【发布时间】:2018-08-02 08:00:17
【问题描述】:

like - 网络操作和位图操作图像加载和其他类型的工作我可以为我的整个应用程序创建一个 TheadPoolExecuter 并在其上执行。

如果答案是否定的 -> 为什么?以及如何为每个操作创建thread pool

或者如果是 -> 是否出现性能问题?

提前致谢。

【问题讨论】:

  • 我可以为我的整个应用程序创建一个单独的 TheadPoolExecuter 并在其上执行吗 可以,事实上我已经看到 Google 示例的源代码使用了这种方法。跨度>
  • Enzkie 我也看到了它们,但我的困惑并不清楚,因为谷歌样本使用两个 thead 池,一个用于解码,第二个用于下载。那么为什么 google 使用两个线程池中的一个。?
  • IMO 他们这样做是因为他们希望将长时间运行的任务与那些更快完成的任务隔离开来。想象一下,您的池中有 4 个线程,突然有 4 个繁重的网络请求首先加载到池中,而一个简单的数据库查询当前处于挂起状态,在这种情况下会延迟简单的请求。
  • @Enzokie 定义差异的更好方法是 CPU 绑定任务与阻塞任务。您当然需要一个线程池来处理所有受 CPU 限制的工作。对于阻塞调用,您需要更多线程什么都不做。但是,在 Android 上,您应该避免阻塞网络 API。
  • @MarkoTopolnik 感谢您的帮助。

标签: java android performance kotlin


【解决方案1】:

这两种方法都有优点和缺点。

如果是单线程池(我想是单例实现):
➕您有一个提交后台任务的入口点
➕ 轻松实现和控制生命周期
➖ 如果你有很多不同的快速任务和一些长时间运行的任务,长时间运行的任务可能会在用户等待 UI 中的一些快速操作时将所有线程保留在有限的池中

不同的线程池(一个池用于一种任务):
➕ 长时间运行任务的线程池可以累积任务,快速任务可以在自己的线程池中独立执行
➕ 您对应用程序中的任务了如指掌 - 您可以使用线程工厂为每种类型的任务微调池大小、设置线程优先级、初始堆栈大小等
➕如果你定义线程组和线程名称,它可以帮助你调试
➖ 有不同的线程池涉及硬控制它们的生命周期
➖ 这种实现不会在任务类分离不佳的情况下带来很多好处

无论如何,你需要一些妥协和对优势的评估

【讨论】:

  • 假设我有 5 种不同类型的任务并且当我用最小和最大 Runtime.getRuntime().availableProcessors() 初始化这些线程池时有自己的线程池是 Couse 性能问题吗?在安卓中
  • availableProcessors() 仅对 CPU 密集型任务有意义。它与阻塞任务无关。
  • @SKPanchal 很多线程,当然不是很好,但我们需要记住,系统无论如何都会根据优先级为每个线程分配工作时间。这意味着它们自己池中的短任务不会卡在队列中,并且会尽快处理它们
【解决方案2】:

我认为你可以做到这一点,根据oracle documentation 应该可以提高你的表现:

线程池解决了两个不同的问题:它们通常提供 执行大量异步时提高性能 任务,由于减少了每个任务的调用开销,并且它们提供了一个 限制和管理资源的方法,包括线程, 执行任务集合时消耗。每个 ThreadPoolExecutor 还维护了一些基本的统计信息,比如完成的数量 任务。

【讨论】:

    猜你喜欢
    • 2016-10-18
    • 1970-01-01
    • 2012-09-03
    • 2013-07-07
    • 2011-11-25
    • 1970-01-01
    • 2011-03-28
    • 2019-02-10
    • 2019-12-04
    相关资源
    最近更新 更多