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

标签 android multithreading handler blockingqueue looper

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

两种可用的机制是:

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

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

    如果两个线程与一个队列一起使用,则使用者必须在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/

    相关文章:

    Android - 如何为 API-28 使用 startForegroundService() 和 startForeground()?

    android - MonoDroid Looper.MyQueue() 卡在某些 Activity/空闲处理程序上?

    android - 无法禁用 android.widget.Button

    java - 在android上动态创建按钮

    java - java多线程服务器中的客户端编号

    c# - .Net 中的多个 Parallel.ForEach 循环

    c - 我如何将指向队列的指针作为 pthread_create 中的参数传递(收到不兼容的转换警告)?

    linux - 进程 sighandler 可以处理 linux 信号 SIG_KILL 吗?

    java - Handler().postDelayed() 在方向改变时发送多个 Intent

    java - 连接到外部数据库 - Android 应用程序