Android中的多线程是如何工作的?

12

我试图并行运行4个线程,但失败了。

我尝试使用同步的wait()notify()CyclicBarrierThreadPoolExecutorCountDownLatchAsyncTask等方法,但都没有成功地并行运行线程。

在Android中是否能够并行运行4个线程(即同时运行)?如何做到?

注意:我正在使用AudioRecordAudioTrack APIs来进行音频流传输。


您可以使用异步任务(Async Task)并行运行它们。 - Taruni
你能详细说明问题是什么吗? - Henry
@Henry,我无法同时运行所有4个线程。如何实现这一点? - Rahul Baradia
2个回答

17

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

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

问题:我无法并行运行线程,即第一个线程运行:4次,第二个,第三个和第四个仅运行1次。如何使其并行运行(尝试使用上述线程,但未能成功运行所有线程并行)?

如果您的目标仅是让所有线程都处于活动状态,请查看Java线程池(以及更通用的执行者Executors )。

Android支持多线程吗?如果是的话,Android中的多线程是如何工作的?

是的,Android支持多线程。除了线程池和Executor之外,实现它最常用的方法是使用AsyncTask异步任务

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

真正的魔力发生在您覆盖的onPreExecute()onPostExecute()中,这两个方法都在UI线程上执行。这应该可以防止出现Activity未附加的消息。

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

另外,请看一下Android中的处理器

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


谢谢。但是当我尝试使用AsyncTask时,我会丢失很多音频数据。也就是说,我正在使用AsyncTask将音频语音数据发送到服务器,它需要一定的时间来发送。在此期间,我将在应用程序端丢失语音数据。 - Rahul Baradia
除了录制音频之外,您还在同时运行什么?可能会出现一些同步问题。 - Sahil Mahajan Mj
这是某种音频聊天应用吗?所以,您的意思是首先它记录所有音频,然后从服务器接收音频语音。那么httpclient有什么问题呢? - Sahil Mahajan Mj
这是流式音频。它记录、发送、接收和播放,所有操作都在不同的线程中。想要并行或同时运行。我该如何实现? - Rahul Baradia
1
可能会出现死锁情况,因为您提到的所有操作都非常互动,并且它们都需要使用系统资源。我会看看我们如何解决这个问题,然后再回复您。但这确实是一项复杂的任务。 - Sahil Mahajan Mj
显示剩余8条评论

2
  1. 您可以运行4个不同的线程,但是为了实现并行执行(同时执行),您的架构必须支持。如果您有单核CPU,则线程执行的顺序取决于调度程序,并且每次只能执行一个线程。
  2. 执行的顺序和时间由调度程序决定。
  3. 是的,您可以依赖于AsyncTask或Java功能(例如Executors)。

根据第一个观点,这是否意味着单个核心只能运行一个线程?那并发运行线程呢? - Anmol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接