【问题标题】:Android threads with queue vs Handler/Looper: which one is efficient?带有队列的 Android 线程 vs Handler/Looper:哪一个是高效的?
【发布时间】:2014-02-11 02:32:52
【问题描述】:

我有一个生产者-消费者的情况,我想在两种机制之间做出决定来实现它。这是一个音频录制/编码案例:生产者不断地轮询设备麦克风以获取录制的音频,当音频样本可用时,将该样本传递给作为编码器的消费者进行编码和保存。

两种可用的机制是:

  1. 带有队列的两个线程将消息从生产者传递到消费者。
  2. 或者,作为消费者的 Handler,当消息可用时,消息由生产者发布。

但是,我不确定哪个更有效:

如果一个队列使用了两个线程,那么消费者必须在一个while循环中运行。例如,如果任务持续 5 分钟,则此循环必须运行 5 分钟。虽然,如果使用 Handler,我的理解是,处理程序(消费者)仅在有消息时运行,当它的 handleMessage 方法被调用时。 (关于处理程序如何工作的假设是否正确,它不会在 continue 循环中运行?)。因此,我得出结论,在这方面,handler 效率更高。

但是,另一方面,队列似乎是更简单的机制,可能需要更少的工作,与 Handler 的消息传递机制相比,它在每条消息上都重复(再次,这个假设是真的吗?)

现在,基于上述两个在我看来似乎相互矛盾的假设,我不确定这两种机制中的哪一种更有效。

注意:我没有发布任何代码,因为我认为这是一般情况。

谢谢。

编辑:

在实现方面,这两种机制实现起来都比较简单。我的问题是关于两种机制的运行时行为。因为,我至少有 5 个线程,其中每个线程都必须连续运行。现在,我的问题是,在这种情况下,这两个选项中哪一个更好(特别是对于 Android 应用程序,考虑到 Handlers 和 Loopers 以及 HandlerThread 的工作方式)?

  1. 实现 N 个线程,每个线程都在一个 while 循环中运行。通信机制更简单,一个队列。但是有 N 个并发循环。
  2. 将生产者实现为在循环中运行,但将消费者实现为处理程序。不是N个并发循环(至少表面上看,后面可能实际上是这样),而是一个更复杂的通信:涉及线程消息队列、Looper机制、特殊消息传递等。

【问题讨论】:

  • 熟悉 Otto 库?在这种情况下可能很整洁
  • 考虑应用坎宁安的简单法则(“做最简单的可能可行的事情”(Ward Cunningham))来帮助确定要做什么。决定哪种策略最容易实施,然后去做。如果它有效,那就太好了!你完成了!如果没有,您只投入了执行最简单解决方案所需的时间 - 现在您可以实施更复杂的解决方案,希望能解决您的问题。如果那不明白 - 好吧,这就是他们制作绘图板的原因。 :-) 分享和享受。

标签: android multithreading handler blockingqueue looper


【解决方案1】:

在我看来,正是由于您的论点,第二种方法会更好地工作:您必须一直运行一个循环,即使这是在一个线程中运行,最终这些都是您浪费的资源,并且会在处理该音频的昂贵操作中非常感谢。这可能会通过setPriority(...) 调整线程优先级来补偿,虽然会玩弄并测量性能。

另一方面,Handler 方法本身会决定何时调用消费者进程以及何时调用,因此您可以获得第一个线程所需的资源。所以,即使这可能有点难以实现,我也会这样做。

【讨论】:

  • 感谢您的回复。但是,我的问题是关于这两种机制的运行时行为,而不是实现难度。
  • 我的答案是基于运行时行为,而不是实现难度。我最后的评论只是关于实施我认为会更好的解决方案的一个方面,但内容是面向行为的,以及我会做些什么来获得最好的性能。
  • 嗨 HNK,你是对的。我忘了提到我的评论只是关于你评论中的最后一句话,而不是全部内容。但是,关于这个问题,我认为,唯一知道的方法就是试验这两种方法。
  • @NazarMerza 毫无疑问,尝试两者都会为您带来最佳数据,从中选择最佳方法。由于我还没有测试过它(不过看起来很有趣),我的答案只是 theoretical 部分,也许其他实现会更有效。只需尝试两者并测试它们。
  • 真的。我的假设也是基于逻辑推理而不是实际数据。但是,正如您所提到的,它可以反过来。
【解决方案2】:

处理程序使用线程执行:

http://developer.android.com/reference/android/os/Handler.html

您只会与实现它的代码一样高效。但是,除非您确信自己了解线程实现与处理程序实现的低级细节,否则您的自定义线程的效率很可能会降低。

换句话说,对于通用实现,这里没有明确的答案。它是特定于案例和开发人员的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2014-09-02
    • 1970-01-01
    相关资源
    最近更新 更多