【问题标题】:Worker Threads On Single Core Device单核设备上的工作线程
【发布时间】:2013-12-03 19:42:41
【问题描述】:

我在这里转贴了my question from Android Enthusiasts,因为这更像是一个编程问题,并且被推荐了。 反正。这里是:

我正在制作一个应用程序,它会更改 ROM 键值的 build.prop。然而,Android 经常给我一个 ANR 警告,因为我正在 UI 线程上完成所有工作。在 Android 文档中,它告诉我应该使用工作线程,而不是在 UI 线程中做任何工作。但是,我正在构建这个系统应用程序,以便与单核设备的 ROM 一起使用。

我为什么要使用工作线程,因为这不是效率低下吗?因为,Android 必须暂停 UI 线程,加载工作线程,当再次使用 UI 时,暂停工作线程并再次加载 UI 线程。这不是效率低吗?

那么,我应该使用工作线程(这会减慢 UI 线程的速度)还是只在 UI 线程上完成所有工作*即使应用程序 UI 真的很慢)?

【问题讨论】:

  • 使用任何常见的最佳实践来实现您的代码。在这种情况下,使用工作线程。
  • 不用担心核心。当 ui 线程不工作时,调度程序将允许您的工作线程运行,从而提供流畅的用户体验。如果您的 UI 因工作线程而变慢,请减少这些线程的数量/优先级。
  • 使用工作线程。将其优先级降低到低于 UI 的优先级。结果 - UI 响应正常,工作仍然(几乎)同时完成。
  • @MartinJames,我不知道该怎么做,我想我在文档中有更多的阅读要做!

标签: android multithreading process


【解决方案1】:

如果您的用户是机器人,那么您的逻辑将非常合理。没有上下文切换等于(非常轻微地)减少了总计算时间。你可以对它进行基准测试,看看到底有多少。

但是,在当前(和不久的将来),您的用户很可能是人类,因此您需要开始思考心理学:移动的进度条或一般的响应性会给您的用户一种任务是任务的印象实际上比没有任何反馈需要更短的时间。 有了反馈,主观速度要快得多。

有很多关于主观速度主题的论文,我可以在网上找到的first onea video 中的进度条进行了很好的比较(基本上,有些进度条似乎比其他进度条走得更快,从而减少了主观的总体等待时间)。

【讨论】:

  • 感谢您的回答 - 这真的很有用:)
【解决方案2】:

使用工作线程。

正如您所说,在 UI 线程上执行所有操作都会锁定您的 UI,直到操作完成。这意味着您无法更新进度,无法处理输入事件(例如用户按下取消按钮)等。

您对上下文切换速度的担忧是错误的——无论如何,这种情况总是会发生,因为核心系统进程和其他应用程序在后台运行。一些快速的谷歌搜索显示,同一进程中的上下文switching a threadtypically faster,而不是进程级上下文切换。创建线程和随后的上下文切换会带来稍微更多的开销,但这可能会很短 - 特别是如果您只有 1 个线程来完成这项工作。由于我在上面单独列出的原因(UI 更新和接受用户输入的能力),请考虑几毫秒的整体性能损失。

【讨论】:

  • 感谢您的回答,但您在最后一段的第二句话中有点迷失了我 - 抱歉,我是菜鸟!
  • 别担心! Context switching 是您所描述的停止 UI 线程并加载工作线程,然后再返回。 how threads differ from processes 可能值得一读。
  • 好的,我稍后会调查 :) 谢谢
猜你喜欢
  • 2013-05-11
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2015-04-23
  • 1970-01-01
相关资源
最近更新 更多