【问题标题】:Are AsyncTasks also executed on the same background thread in the SERIAL_EXECUTOR?AsyncTasks 是否也在 SERIAL_EXECUTOR 中的同一后台线程上执行?
【发布时间】:2016-01-20 20:05:01
【问题描述】:

关于Honeycomb+上AsyncTasks的执行顺序问题。每Google's documentation

在首次引入时,AsyncTask 是在单个 后台线程。从 DONUT 开始,这变成了一个池 允许多个任务并行运行的线程。从...开始 HONEYCOMB,任务在单线程上执行,避免常见 并行执行导致的应用程序错误。

我的问题是,在后台串行执行的 AsyncTask 是否也会在同一个线程上运行?

例如,正在执行任务 A、B 和 C 的 AsyncTask.SERIAL_EXECUTOR 会在线程 1 上运行任务 A,然后在线程 1 上运行任务 B,然后在线程 1 上运行任务 C?

或者,AsyncTask.SERIAL_EXECUTOR 是否有可能在线程 1 上执行任务 A,然后在线程 2 上执行任务 B,然后在线程 3 上执行任务 C?在这个方案中,所有任务都是串行执行的,但它们是在不同的后台线程上运行的。

我之所以问是因为我在 doInBackground 中添加了一些调试代码,并且我看到名为 AsyncTask #5AsyncTask #4AsyncTask #2AsyncTask #3 的线程,而我以为每次命名时只会看到一个线程“AsyncTask Worker”什么的。

(我只是想确认一下我自己对 AsyncTasks 预期如何工作的心理模型;我没有报告这个问题中的错误或问题。)

谢谢!

【问题讨论】:

  • "在后台串行执行的 AsyncTask 是否也会在同一个线程上运行?" -- the implementation 很奇怪。 AsyncTask 不使用单线程线程池,而是维护自己的队列,并一次将任务提供给常规的多线程线程池(可见为THREAD_POOL_EXECUTOR)。因此,您观察到的行为非常合理。
  • 谢谢!如果您想将此作为我接受的答案,我很乐意这样做!

标签: android android-asynctask threadpoolexecutor


【解决方案1】:

在后台串行执行的 AsyncTask 是否也会在同一个线程上运行?

The implementation 很奇怪。 AsyncTask 不使用单线程线程池,而是维护自己的队列,并一次将任务提供给常规的多线程线程池(可见为 THREAD_POOL_EXECUTOR)。

AsyncTask.SERIAL_EXECUTOR 是否有可能在线程 1 上执行任务 A,然后在线程 2 上执行任务 B,然后在线程 3 上执行任务 C?在这个方案中,所有任务都是串行执行的,但它们是在不同的后台线程上运行的。

这是很有可能的,假设如果池当前未使用,ThreadPoolExecutor 并不总是分发同一个线程。这比我通常更深入地了解 Android 的 Java 框架类的实现。另请注意,ThreadPoolExecutor 本身的实现将在未来发生变化,因为 Android 正在转向 OpenJDK 并远离其基于 Apache Harmony 的框架类。因此,我尽量不对ThreadPoolExecutor 的实现如何工作做出任何假设。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多