【发布时间】:2014-02-11 02:32:52
【问题描述】:
我有一个生产者-消费者的情况,我想在两种机制之间做出决定来实现它。这是一个音频录制/编码案例:生产者不断地轮询设备麦克风以获取录制的音频,当音频样本可用时,将该样本传递给作为编码器的消费者进行编码和保存。
两种可用的机制是:
- 带有队列的两个线程将消息从生产者传递到消费者。
- 或者,作为消费者的 Handler,当消息可用时,消息由生产者发布。
但是,我不确定哪个更有效:
如果一个队列使用了两个线程,那么消费者必须在一个while循环中运行。例如,如果任务持续 5 分钟,则此循环必须运行 5 分钟。虽然,如果使用 Handler,我的理解是,处理程序(消费者)仅在有消息时运行,当它的 handleMessage 方法被调用时。 (关于处理程序如何工作的假设是否正确,它不会在 continue 循环中运行?)。因此,我得出结论,在这方面,handler 效率更高。
但是,另一方面,队列似乎是更简单的机制,可能需要更少的工作,与 Handler 的消息传递机制相比,它在每条消息上都重复(再次,这个假设是真的吗?)
现在,基于上述两个在我看来似乎相互矛盾的假设,我不确定这两种机制中的哪一种更有效。
注意:我没有发布任何代码,因为我认为这是一般情况。
谢谢。
编辑:
在实现方面,这两种机制实现起来都比较简单。我的问题是关于两种机制的运行时行为。因为,我至少有 5 个线程,其中每个线程都必须连续运行。现在,我的问题是,在这种情况下,这两个选项中哪一个更好(特别是对于 Android 应用程序,考虑到 Handlers 和 Loopers 以及 HandlerThread 的工作方式)?
- 实现 N 个线程,每个线程都在一个 while 循环中运行。通信机制更简单,一个队列。但是有 N 个并发循环。
- 将生产者实现为在循环中运行,但将消费者实现为处理程序。不是N个并发循环(至少表面上看,后面可能实际上是这样),而是一个更复杂的通信:涉及线程消息队列、Looper机制、特殊消息传递等。
【问题讨论】:
-
熟悉 Otto 库?在这种情况下可能很整洁
-
考虑应用坎宁安的简单法则(“做最简单的可能可行的事情”(Ward Cunningham))来帮助确定要做什么。决定哪种策略最容易实施,然后去做。如果它有效,那就太好了!你完成了!如果没有,您只投入了执行最简单解决方案所需的时间 - 现在您可以实施更复杂的解决方案,希望能解决您的问题。如果那不明白 - 好吧,这就是他们制作绘图板的原因。 :-) 分享和享受。
标签: android multithreading handler blockingqueue looper