带队列vs Handler / Looper的Android线程:哪一个有效?

时间:2014-02-09 21:04:11

标签: android multithreading handler blockingqueue looper

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

两种可用的机制是:

  1. 两个带有队列的线程,用于将消息从Producer传递给Consumer。
  2. 或者,作为消费者的处理程序,生产者在可用时发布消息。
  3. 但是,我不确定哪一个更有效率:

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

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

    现在,基于上述两个假设,我认为这两个假设相互矛盾,我不确定这两个机制中哪一个更有效率。

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

    感谢。

    修改

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

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

2 个答案:

答案 0 :(得分:0)

在我看来,第二种方法可以更好地运行,因为你的论点:你必须一直运行循环,即使这是在一个线程中运行,最后这些是你浪费的资源,将是非常感谢处理音频的昂贵操作。这可以通过setPriority(...)调整线程优先级来补偿,尽管可以使用并测量性能。

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

答案 1 :(得分:0)

使用线程执行处理程序:

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

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

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