关于Honeycomb +上AsyncTasks
的执行顺序的问题。每Google's documentation:
首次引入时,AsyncTasks在单个上串行执行 背景线程。从DONUT开始,这被改成了一个池 允许多个任务并行运行的线程。从...开始 HONEYCOMB,任务在单个线程上执行以避免常见 并行执行导致的应用程序错误。
我的问题是,在后台串行执行的AsyncTasks是否也会在同一个线程上运行?
例如,执行任务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是如何工作的;我没有在这个问题中报告错误或问题。)
谢谢!
答案 0 :(得分:0)
在后台串行执行的AsyncTasks是否也会在同一个线程上运行?
The implementation很奇怪。 AsyncTask不是使用单线程线程池,而是维护自己的队列,并将任务一次一个地提供给常规多线程线程池(可见为THREAD_POOL_EXECUTOR)。
是否有可能AsyncTask.SERIAL_EXECUTOR将在线程1上执行任务A,然后在线程2上执行任务B,然后在线程3上执行任务C?在此方案中,所有任务都是串行执行的,但它们是在不同的后台线程上运行的。
这是非常可能的,假设如果池当前未使用,ThreadPoolExecutor
并不总是分发相同的线程。这比我通常更深入到Android的Java框架类的实现。另请注意,ThreadPoolExecutor
本身的实现将来会发生变化,因为Android正在转向OpenJDK并远离基于Apache Harmony的框架类。因此,我尽量不对ThreadPoolExecutor
的实现如何运作做出任何假设。