【问题标题】:How does multi-threading work in Android?多线程在 Android 中是如何工作的?
【发布时间】:2012-12-27 11:30:16
【问题描述】:

我正在尝试并行运行 4 个线程,但失败了。

我尝试过使用同步 wait()notify() CyclicBarrier ThreadPoolExecutor CountDownLatch AsyncTask 和许多其他方法,但没有管理并行运行线程。

我们可以并行运行 4 个线程(即在 android 中同时运行)吗?怎么样?

注意:我正在使用 AudioRecordAudioTrack API 处理音频流。

【问题讨论】:

  • 您可以使用异步任务并行运行它们。
  • 你能详细说明问题是什么吗?
  • @Henry 我无法一次运行所有 4 个线程。如何做到这一点?

标签: android multithreading


【解决方案1】:

我们可以在 Android 中同时运行 4 个线程吗??

是的,您可以并行运行 4 个线程。添加更多线程通常会有所帮助,但在某些时候,它们会导致一些性能下降。但是 4 个线程不会导致问题。

问题:我无法并行运行线程,即第一个线程运行: 4 次,第 2 次,第 3 次,第 4 次只有 1 次。如何使其运行(尝试使用 提到的线程但未成功运行所有线程并行)并行?

如果您的目标只是让所有线程主动处理,我建议查看 Java thread pools(以及更普遍的 Executors)。

android 支持多线程?如果是,多线程如何工作 安卓??

是的,Android 支持多线程。最好的实现方式(除了线程池和执行器)是AsyncTask

AsyncTask 允许您实现doInBackground(),您的线程可以在其中完成任务。这类似于您从 Thread 获得的功能。

真正的魔法发生在您覆盖onPreExecute()onPostExecute() 时,它们都在 UI 线程上执行。这应该可以防止您收到有关您的 Activity 未附加的消息。

这个answer 包含一个用于AsyncTask 的小代码示例,可以帮助您入门。

另外,看看 Android 中的Handlers

Edit- 我在研究过程中发现,录制、发送和接收音频都是非常互动的过程,它们需要同步和 IO 资源。最好的解决方案可能是,您可以为每个操作创建单独的 AsyncTask,以便每个操作在其单独的 AsyncTask 中执行。

【讨论】:

  • 谢谢.. 但是当我尝试 AsyncTask 时,我丢失了许多音频数据。即我正在使用 AsyncTask 将音频语音数据发送到服务器,它需要自己的时间来发送它。到那时我会在应用端丢失语音数据。
  • 我没有遇到任何异步任务的问题,如果你想使用并发线程,你可以看看线程池和执行器。
  • 我也试过了。我每 40 毫秒记录 16Kb 的音频数据。并行运行另一个线程需要时间。
  • 您在录制音频的同时还有哪些并行运行。可能存在一些同步问题。
  • 可能会出现死锁情况,因为您提到的所有操作都非常具有交互性,并且都需要使用系统资源。我会看看我们如何解决这个问题,我会回复你的。但这确实是一项复杂的任务。
【解决方案2】:
  1. 您可以运行 4 个不同的线程,但为了并行(同时)执行,您必须支持它。如果您有一个单核 cpu,则执行线程的顺序取决于调度程序,并且一次只会执行一个线程
  2. 执行的顺序和时间由调度程序决定。
  3. 是的。您可以同时依赖 AsyncTask 或 java 特性(例如 Executors)

【讨论】:

  • 根据第一点,这是否意味着只有一个线程可以在单核上运行?线程的并发运行呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多