我有一个生产者-消费者的情况,我想决定在两种机制之间实现它。这是一种音频记录/编码的情况:生产者连续轮询设备麦克风,以获取录制的音频,当音频样本可用时,将该示例传递给作为编码器的使用者,以进行编码和保存。
现有的两个机制是:
但是,我不知道哪一个更有效率:
如果两个线程与一个队列一起使用,那么使用者必须在with循环中运行。例如,如果任务持续5分钟,则此循环必须运行5分钟。虽然,如果使用Handler,我的理解是,处理程序(使用者)只在有消息时才运行,当调用它的handleMessage方法时。(关于处理程序如何工作的假设是否为真,即它不会在连续循环中运行?)。因此,我的结论是,在这方面,处理程序更有效。
但是,另一方面,与Handler的消息传递机制相比,队列似乎是更简单的机制,可能需要更少的工作,而Handler的消息传递机制在每条消息上都会重复(同样,这种假设是真的吗?)
现在,基于上述两种假设(在我看来,这两种假设似乎相互矛盾),我不确定这两种机制中哪一种更有效。
注意:我没有发布任何代码,因为,我认为这是一个通用的情况。
谢谢。
编辑:
在实现方面,这两种机制的实现相对简单。我的问题是关于两种机制的运行时行为。因为,我至少有5个线程,其中每个线程都是连续运行的关键。现在,我的问题是,在这种情况下,这两个选项中哪一个更好(特别是对于Android应用程序,考虑到处理程序、Loopers和HandlerThread是如何工作的)?
发布于 2014-02-09 21:26:51
在我看来,第二种方法会更好地工作,因为您的论点:您将不得不一直运行一个循环,即使这是在线程内运行,最后这些都是您浪费的资源,在处理该音频的昂贵操作中,您将非常感激。可以通过setPriority(...)调整线程优先级来弥补这一不足,尽管它是在玩和测量性能。
另一方面,Handler方法将本机决定何时调用使用者进程,以及何时调用,因此您将获得第一个线程所需的资源。所以,即使这可能更难实现,我还是会这么做的。
发布于 2014-02-09 21:39:50
处理程序使用线程执行:
http://developer.android.com/reference/android/os/Handler.html
您将仅限于实现它的代码的效率。但是,除非您确信您了解线程实现与处理程序实现的低层次细节,否则定制线程很可能效率较低。
换句话说,对于一般实现,这里没有明确的答案。这是特定的案例和开发人员。
https://stackoverflow.com/questions/21665015
复制相似问题