2016-01-20 26 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的實現將如何工作。

相關問題