成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

串行還是并行?——記一次 AsyncTask 問題排查

mo0n1andin / 3533人閱讀

摘要:當(dāng)然,如果你的核心數(shù)夠多,到個線程的并行度不滿足的話,也可以自定義一個線程池來執(zhí)行,不過這樣的話,要注意自己維護這個線程池的初始化,釋放等等操作了。

事情起源于一個bug排查,一個AsyncTask的子類,執(zhí)行的時候發(fā)現(xiàn)onPreExecute方法執(zhí)行了,doInBackground卻遲遲沒有被調(diào)用。
懂AsyncTask一些表面原理的都知道,onPreExecute方法是在主線程執(zhí)行,doInBackground方法是在后臺線程執(zhí)行,所以很明顯是后臺線程被卡住了執(zhí)行不了,所以這就涉及到AsyncTask的原理問題了,查看出現(xiàn)bug的版本——Android 6.0源碼可以知道,AsyncTask里面維護著兩個線程池,THREAD_POOL_EXECUTOR和SERIAL_EXECUTOR,其中SERIAL_EXECUTOR是默認(rèn)的線程池:

如果用AsyncTask.execute(params...)方法來執(zhí)行任務(wù),就會用到默認(rèn)的線程池,即SERIAL_EXECUTOR;可以看出SERIAL_EXECUTOR會讓所有的線程串行執(zhí)行:

而且由于SERIAL_EXECUTOR被聲明為static,所以,同一個進程里的AsyncTask都會共享這個線程池,這就意味著,在同一個進程里,前面的線程不結(jié)束,后面的線程就會被掛起,這正是我遇到的情況。
接下來排查所有用AsyncTask.execute方法來執(zhí)行任務(wù)的情況,終于找到了一個不合理的調(diào)用————在doInBackground里請求網(wǎng)絡(luò),一直死等response,而沒有超時釋放。修復(fù)了這種情況,問題就迎刃而解了。

除了這種解決前面線程不合理設(shè)計的辦法,還有沒有別的解決方式呢,因為有時候,我們的設(shè)計確實是讓后臺線程死循環(huán),不跳出的。

當(dāng)然有的,在AsyncTask設(shè)計上就考慮到了,前面說到AsyncTask里面還有一個線程池THREAD_POOL_EXECUTOR,從它的初始化參數(shù)可以看出,這是一個支持2到4個線程并行的線程池:

所以,使用AsyncTask執(zhí)行任務(wù)的時候,請使用AsyncTask.executeOnExecutor(THREAD_POOL_EXECUTOR)來讓你的任務(wù)跑在并行的線程池上,避免出現(xiàn)并前面線程阻塞的情況。當(dāng)然,如果你的CPU核心數(shù)夠多,2到4個線程的并行度不滿足的話,也可以自定義一個線程池來執(zhí)行AsyncTask,不過這樣的話,要注意自己維護這個線程池的初始化,釋放等等操作了。

PS:AsyncTask是不是一開始就是被設(shè)計成這樣的呢?筆者調(diào)研了一下,其實Android 1.5剛開始引入AsyncTask的時候,execute方法確實是串行執(zhí)行的,類定義里面只有SERIAL_EXECUTOR線程池;到1.6版本時,改用并行線程池THREAD_POOL_EXECUTOR,再到3.0版本至今,就成了上面說的模樣————定義兩個線程池,但是默認(rèn)用串行池。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67602.html

相關(guān)文章

  • AsyncTask異步任務(wù)類

    摘要:異步任務(wù)的構(gòu)造方法主要用于初始化線程池先關(guān)的成員變量創(chuàng)建一個新的異步任務(wù)。所以,我們是必須確保在銷毀活動之前取消任務(wù)。 目錄介紹 01.先看下AsyncTask用法 02.AsyncTask源碼深入分析 2.1 構(gòu)造方法源碼分析 2.2 看execute(Params... params)方法 2.3 mWorker和mFuture的創(chuàng)建過程 03.異步機制的實現(xiàn) 04.不同...

    dongxiawu 評論0 收藏0
  • 一次Node項目的優(yōu)化

    摘要:相關(guān)環(huán)境由于是一個幾年前的項目,所以使用的是這樣的。一些小提示本次優(yōu)化筆記,并不會有什么文件的展示。將異步改為了串行,喪失了作為異步事件流的優(yōu)勢。 這兩天針對一個Node項目進行了一波代碼層面的優(yōu)化,從響應(yīng)時間上看,是一次很顯著的提升。 一個純粹給客戶端提供接口的服務(wù),沒有涉及到頁面渲染相關(guān)。 背景 首先這個項目是一個幾年前的項目了,期間一直在新增需求,導(dǎo)致代碼邏輯變得也比較復(fù)雜,接...

    dreamans 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<