【问题标题】:Android Execute Multiple AsyncTask ParallelyAndroid并行执行多个AsyncTask
【发布时间】:2015-05-03 06:48:16
【问题描述】:

大家好,我对在 Android 中并行执行多个异步任务有点困惑

在 Donut 之前它只是单个处理意味着我们一次只能执行一个任务,但后来它发生了变化,我们可以并行执行多个 asynctask,在这种情况下,执行多个 asynctask 也有限制,我们只能执行一次有 138 个异步任务线程,否则它将通过异常,但后来的蜂窝它已经改变,我们可以一次执行 5 个异步任务,10 个可以在等待队列中,但是如果我们一次执行超过 15 个异步任务意味着如果我将一次执行 16 个任务,然后它将并行执行 6 个任务,其中 10 个将在队列中,这意味着等待队列中至少有 10 个任务等待工作线程完成,并且稍后在 Kitkat 中它已经变化,它首先获取当前在 Vm 中运行的处理器数量,并据此执行多个异步任务。

现在我的问题是:

  1. 并行执行多个异步任务有什么问题。

  2. 为什么限制一次只能执行 138 个异步任务。

  3. 为什么和安卓版本不一样。

  4. 在 kitkat 中获取当前在 VM 中运行的处理器数量并据此执行异步任务的确切含义是什么。

  5. asynctask 在后台使用什么来跟踪等待的 asynctask 和 Running Task。

请回答我的问题。

【问题讨论】:

  • 这是一部手机,不是超级计算机。需要有个限度。如果 android 允许您的应用程序并行运行 x 个异步任务,其他应用程序也会利用它并并行运行它们的 x 个异步任务。操作系统管理这么多线程变得很麻烦。因此,需要有一个限制。每台机器都有fork的限制。除此之外,它无法创建新线程。

标签: java android multithreading asynchronous android-asynctask


【解决方案1】:

引用 Android 开发者的 AsyncTask

AsyncTask 被设计成一个围绕 Thread 和 Handler 的辅助类 并且不构成通用线程框架。异步任务 理想情况下应用于短操作(几秒钟在 大多数。)如果您需要保持线程长时间运行, 强烈建议您使用由 java.util.concurrent 包,例如 Executor、ThreadPoolExecutor 和 未来任务。

在内部,AsyncTask 是通过Executor 实现的,默认是SerialExecutor

限制 == CPU 内核数的意义在于,如果限制更大,则启动的线程之间将持续存在竞争。您知道一天结束时您可以同时让线程工作。在许多情况下,线程之间的这种竞争不是问题,但在某些情况下却是。我猜谷歌刚刚决定利大于弊,这就是为什么他们再次回到SerialExecutor。再次引用AsyncTask 类描述:

从 HONEYCOMB 开始,任务在单线程上执行,以避免并行执行导致的常见应用程序错误。

这些问题大多是InterruptedExceptionIllegalStateException

最后,如果您真的知道自己在做什么,并且有充分的理由覆盖 Google 的默认行为,您可以使用 AsyncTask.executeOnExecutor(Executor, Object[]) 并传入 THREAD_POOL_EXECUTOR

【讨论】:

  • 真的很感谢你的回答@Vesko,但我也只是想从你那里知道,如果一旦我开始了一个异步任务,我可以在执行之间停止它,我在用 Asynctask 调用 cancel() 方法后尝试了它object 但它不会停止线程执行,但是在这种情况下它不允许调用 onPostExecute() 但 doinBackground() 方法仍然不会停止其执行。
  • 是的,您可以调用 myAsyncTask.cancel(boolean mayInterruptIfRunning)。阅读 cancel() 方法的文档以详细了解它是如何工作的(它不像听起来那么直观)
  • 你好@Vesko你能告诉我谁处理和跟踪android中的多个Async任务意味着将它们保持在阻塞线程中并授予它们在Android系统中执行的权限等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多