gpt4 book ai didi

android - 带有队列与处理程序/Looper的Android线程: which one is efficient?

转载 作者:行者123 更新时间:2023-12-03 13:12:44 24 4
gpt4 key购买 nike

我遇到了生产者-消费者的情况,我想在两种机制之间进行实现。这是一个音频记录/编码的情况:生产者连续轮询设备麦克风以获取记录的音频,并且在有音频样本可用时,将该样本传递给作为编码器的使用者以进行编码和保存。

两种可用的机制是:

  • 两个带有队列的线程,用于将消息从生产者传递到消费者。
  • 或作为使用者的处理程序,生产者在可用时在其中发布消息。

  • 但是,我不确定哪一个效率更高:

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

    但是,另一方面,与Handler的消息传递机制相比,队列似乎是更简单的机制,可能需要更少的工作,而Handler的消息传递机制在每条消息上都会重复(同样,此假设是否成立?)

    现在,基于以上两个假设(在我看来这是矛盾的),我不确定这两个机制中的哪一个更有效。

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

    谢谢。

    编辑:

    就实现而言,这两种机制都相对易于实现。我的问题是关于两种机制的运行时行为。作为,我至少有5个线程,对于每个线程来说,连续运行至关重要。现在,我的问题是,在这种情况下,两个选项中哪个更好(特别是对于Android应用程序,考虑Handlers和Loopers和HandlerThread的工作原理)?
  • 实现N个线程,每个线程都在while循环中运行。通讯机制比较简单,排成队列。但是N个并发循环。
  • 将生产者实现为循环运行,但将消费者作为Handlers。不是N个并发循环(至少在表面上,实际上是在后面),而是涉及更多的通信:调用线程消息队列,Looper机制,特殊消息传递等。
  • 最佳答案

    我认为,第二种方法将因您的论点而更好地工作:您将一直运行一个循环,即使该循环在Thread中运行,最终这些都是您浪费的资源,在这些资源中我将不胜感激处理该音频的昂贵操作。这可以通过使用setPriority(...)调整Thread优先级来补偿,尽管可以进行测试并评估性能。

    另一方面,Handler方法将 native 决定何时调用使用者进程以及何时调用使用者进程,因此您将获得第一个线程所需的资源。因此,即使很难实现,我也会坚持下去。

    关于android - 带有队列与处理程序/Looper的Android线程: which one is efficient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21665015/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com