AsyncTasks是否也在SERIAL_EXECUTOR中的同一后台线程上执行?

时间:2016-01-20 20:05:02

标签: android android-asynctask threadpoolexecutor

关于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 #5AsyncTask #4AsyncTask #2AsyncTask #3的线程,当我认为我会只需在每次命名“AsyncTask Worker”或其他东西时看到一个单独的线程。

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

谢谢!

1 个答案:

答案 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的实现如何运作做出任何假设。