簡體   English   中英

AsyncTasks是否也在SERIAL_EXECUTOR的同一后台線程上執行?

[英]Are AsyncTasks also executed on the same background thread in the SERIAL_EXECUTOR?

有關在Honeycomb +上執行AsyncTasks的順序的問題。 根據Google的文檔

首次引入時,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如何工作的思維模型;我沒有在此問題中報告錯誤或問題。)

謝謝!

在后台串行執行的AsyncTasks是否也會在同一線程上運行?

實現是相當奇怪的。 AsyncTask不會使用單線程線程池,而是維護自己的隊列,並將任務一次饋送到常規的多線程線程池(該線程池顯示為THREAD_POOL_EXECUTOR)。

AsyncTask.SERIAL_EXECUTOR是否有可能在線程1上執行任務A,然后在線程2上執行任務B,然后在線程3上執行任務C? 在這種方案中,所有任務都是串行執行的,但是它們正在不同的后台線程上運行。

如果當前未使用該池,則假設ThreadPoolExecutor並不總是ThreadPoolExecutor相同的線程,那是很有可能的。 與我通常相比,這更深入了Android的Java框架類的實現。 還要注意,隨着Android轉向OpenJDK並遠離基於Apache Harmony的框架類, ThreadPoolExecutor本身的實現將在未來發生變化。 因此,我將盡量不對ThreadPoolExecutor的實現方式進行任何假設。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM