【问题标题】:Is there a limit of AsyncTasks to be executed at the same time?同时执行的 AsyncTask 是否有限制?
【发布时间】:2012-03-07 00:01:15
【问题描述】:

这应该有一个简单的答案,但我找不到任何答案。 因为我还是一个机器人假人,所以我来这里问你们这些人。

我一直在制作这个在启动时执行 10 个 AsyncTask 的项目。 每个任务都包含 3 个 URL,它们在那里收集数据并且在应用程序中没有做任何重要的事情(目前)。

我还有 10 个文本视图,用于跟踪 AsyncTasks 的进度。

当一个任务开始时,适当的文本视图被放在“开始” 当任务正在进行时,它将其适当的文本视图设置为“正在下载” 任务完成后,它会将相应的文本视图设置为“已完成”

这是我对 AsyncTask 的观察和质疑。 当我启动应用程序时,我注意到有 5 个文本视图被切换到“正在下载”标记,所以我看到 5 个 AsyncTasks 正在完成他们应该做的工作。完成后,它会启动一个新的 AsyncTask。然而,它们从未超过 5 的限制。

是什么导致了同时运行 5 个异步任务的限制? 我是否在某些我找不到的文件中造成了这种情况? 这是android 2.3.3的限制吗?也许是我用来模拟应用程序的设备的限制?

谁能详细说明一下?

【问题讨论】:

  • 这个问题在这里解决:stackoverflow.com/questions/3077461/…
  • @jengelsma 不是。这肯定是相关的,但是为什么它不超过 5 与为什么它从不低于 5 有点不同。它仍然与核心池大小有关,但该问题/答案并未解决为什么核心池大小会限制当最大池大小为 128 时,并发任务数为 5。
  • 我认为您使用的是 AsyncTask.execute() 而不是 AsyncTask.executeOnExecutor()

标签: android android-asynctask limit android-2.3-gingerbread


【解决方案1】:

是的,有一个限制。 AsyncTaskThreadPoolExecutor 支持,其核心池大小为 5,但最大池大小为 128(从 1.6 - 4.0.3),所以我真的认为你应该看到你的所有 10 个同时运行。但是你不能改变它。如果您真的想做一些不同的事情(除非您有非常具体的原因,否则我不会推荐它),您必须使用更大的池大小进行自定义操作,或者手动启动一堆线程。

更新:

文档是这样说的:

如果运行的线程数多于 corePoolSize 但少于 maximumPoolSize,则仅当队列已满时才会创建新线程。

所以这就是原因。您的队列未满,因此它只是将其保持在核心池大小。

【讨论】:

  • 这里是AsyncTask的来源链接供参考。
  • 如果您想自定义处理您的AsyncTasks 的方式,您可以向executeOnExecutor() 提供任意Executor 实例。
  • @Argyle 任意实例是什么意思?
  • @MuhammadBabar 我的意思是,只要您实现了Executor 接口,您就可以提供一个实例来执行最适合您的任何行为。如果您需要更适合您的情况的东西,则不必使用标准的串行或并行执行器。
  • 是的,你会得到一个异常,这会导致你的应用程序崩溃。你可以抓住它,但最好防止它。 仅供参考:如果您在循环中启动 AsyncTasks,它将在第 129 个崩溃,因此您可以确定前 128 个将被启动和执行。
【解决方案2】:

ThreadPoolExecutor 有一个 corePoolSize、一个 maxPoolSize 和一个 QueueCapacity。 如果使用了 corePoolSize 中的所有线程,则任何其他任务都会放入核心池中每个线程的队列中。在这些队列已满后,将初始化一个新线程,只要它在 maxPoolSize 的限制范围内。

这里的问题是每个线程的队列(除非以编程方式更改)是UNBOUNDED。这意味着您使用了核心池大小中的所有线程,并且任何其他任务都排队等待轮到它们使用其中一个核心线程。他们永远没有机会达到最大池大小。

您必须配置自己的 Executor 并更改队列容量。祝你好运!

【讨论】:

    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多