【发布时间】: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 #5、AsyncTask #4、AsyncTask #2 和 AsyncTask #3 的线程,而我以为每次命名时只会看到一个线程“AsyncTask Worker”什么的。
(我只是想确认一下我自己对 AsyncTasks 预期如何工作的心理模型;我没有报告这个问题中的错误或问题。)
谢谢!
【问题讨论】:
-
"在后台串行执行的 AsyncTask 是否也会在同一个线程上运行?" -- the implementation 很奇怪。
AsyncTask不使用单线程线程池,而是维护自己的队列,并一次将任务提供给常规的多线程线程池(可见为THREAD_POOL_EXECUTOR)。因此,您观察到的行为非常合理。 -
谢谢!如果您想将此作为我接受的答案,我很乐意这样做!
标签: android android-asynctask threadpoolexecutor