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