2016-01-20 27 views
0

关于Honeycomb +上的AsyncTasks执行顺序的问题。每Google's documentationAsyncTasks是否也在SERIAL_EXECUTOR中的同一后台线程上执行?

当第一次推出,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工作者”什么时间。

(我只是想确认AsyncTasks如何预期工作我自己的心智模式。我不报告在这个问题上的错误或问题)

谢谢!

+1

“在后台串行执行的AsyncTasks是否也会在同一个线程上运行?” - [实施](https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/os/AsyncTask.java)很奇怪。AsyncTask不是使用单线程线程池,而是维护自己的队列,并将任务一次一个地提供给常规的多线程线程池(可见为“THREAD_POOL_EXECUTOR”)。因此,你观察到的行为非常合理。 – CommonsWare

+0

谢谢!如果您想将此作为回答让我接受,我很乐意这样做! – esilver

回答

0

在后台连续执行的AsyncTasks是否也会在同一个线程上运行?

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

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

这是非常可能的,假设ThreadPoolExecutor并不总是交出相同的线程,如果池目前未使用。这比我通常会更深入Android的Java框架类的实现。另外请注意,由于Android正在转向OpenJDK并远离基于Apache Harmony的框架类,因此ThreadPoolExecutor本身的实现将在未来发生变化。因此,我尽量不要假设ThreadPoolExecutor的实现将如何工作。

相关问题