Android的線程和線程池

本文是《Android開發(fā)藝術(shù)探索》的學(xué)習(xí)筆記

Android中的線程形態(tài)

1.AsyncTask

AsyncTask封裝了Thread和Handler,是抽象的泛型類,提供了Params,Progress,Result這三個泛型參數(shù)

四個核心方法:

  • 1.onPreExecute() 主線程中執(zhí)行,異步任務(wù)之前調(diào)用
  • 2.doInBackground(Params... par) 異步后臺執(zhí)行
  • 3.onProgressUpdate(Progress... value) 主線程中執(zhí)行,進度發(fā)生變化該方法被調(diào)用
  • 4.onPostExecute(Result res) 主線程中執(zhí)行,異步任務(wù)執(zhí)行完改方法被調(diào)用

使用過程中有以下條件限制

  • 1.AsyncTask的類必須在主線程中加載鲸郊。在5.0的源碼中ActivityThread的main方法中調(diào)用AsyncTask的init方法
  • 2.AsyncTask的對象必須在主線程中創(chuàng)建
  • 3.execute方法必須在UI線程調(diào)用
  • 4.不要在程序中直接調(diào)用上述四個核心方法
  • 5.一個AsyncTask對象只能執(zhí)行一次,即只能調(diào)用一次execute方法,否則報運行時異常
  • 6.版本差異
    • 1.在Android1.6之前是串行執(zhí)行任務(wù)屁魏;
    • 2.Android1.6的時候采取并行處理;
    • 3.Android3.0又采取串行執(zhí)行捉腥,盡管如此3.0以后的版本還可以通過AsyncTask的executeOnExecutor來并行執(zhí)行任務(wù)

2.HandlerThread

HandlerThread繼承了Thread. 該線程運行的時候創(chuàng)建Looper氓拼。可以說是自帶Looper的Thread

3.IntentService

IntentService抽象類抵碟,繼承了Service. 內(nèi)部包含了ServiceHandler和HandlerThread.

IntentService流程1
IntentService流程2
IntentService流程2
public class LocalIntentService extends IntentService {
private static final String TAG = "LocalIntentService";

public LocalIntentService() {
    super(TAG);
}

@Override
protected void onHandleIntent(final Intent intent) {
    final String action = intent.getStringExtra("task_action");
    Log.d(TAG, "receive task :" +  action);

    SystemClock.sleep(3000);
    if ("com.ryg.action.TASK1".equals(action)) {
        Log.d(TAG, "handle task: " + action);
    }
}

@Override
public void onDestroy() {
    Log.d(TAG, "service destroyed.");
    super.onDestroy();
}
}

啟動服務(wù)

 Intent service = new Intent(this, LocalIntentService.class);
service.putExtra("task_action", "com.ryg.action.TASK1");
startService(service);
service.putExtra("task_action", "com.ryg.action.TASK2");
startService(service);
service.putExtra("task_action", "com.ryg.action.TASK3");
startService(service);

Android中的線程池

線程池的優(yōu)點:

  • 1.重用線程桃漾,避免開銷
  • 2.有效控制線程并發(fā)數(shù),避免因搶占資源造成的阻塞
  • 3.有效管理拟逮,提供定時及循環(huán)間隔執(zhí)行等功能

ThreadPoolExecutor

參數(shù):

  • 1.corePoolSize: 核心線程數(shù)撬统。默認情況下核心線程在線程池中會一直存活,即便是閑置狀態(tài)敦迄。如果將ThreadPoolExecutor的allowCoreThreadTimeOut設(shè)置為true,那么閑置的核心線程在等待新任務(wù)到來時會有超時策略
  • 2.maximumPoolSize:容納的最大線程數(shù)
  • 3.keepAliveTime:非核心線程閑置時的超時時長恋追,超過這個時長,非核心線程就會被回收罚屋。
  • 4.TimeUnit
  • 5.workQueue
  • 6.ThreadFactory

線程池的分類

  • 1.FixedThreadPool: newFixedThreadPool方法創(chuàng)建几于。是一種數(shù)量固定的線程池,只有核心線程沿后,且核心線程不會被回收沿彭,可以快速相應(yīng)外界請求。沒有超時機制尖滚,沒有隊列大小限制喉刘。
  • 2.CachedThreadPool:newCachedThreadPool方法創(chuàng)建。是一種線程數(shù)量不定的線程池漆弄,只有非核心線程睦裳。有超時機制。適合執(zhí)行大量的耗時較少的任務(wù)
  • 3.ScheduledThreadPool:核心線程數(shù)量是固定的撼唾,非核心線程數(shù)是沒有固定的廉邑,當(dāng)非核心線程閑置時會被立即回收。主要用于執(zhí)行定時任務(wù)和具有固定周期的重復(fù)任務(wù)。
  • 4.SingleThreadExecutor:線程池內(nèi)部只有一個核心線程蛛蒙,確保所有的任務(wù)都在同一個線程中按順序執(zhí)行糙箍。
    private void runThreadPool() {
        Runnable command = new Runnable() {
        @Override
        public void run() {
            SystemClock.sleep(2000);
        }
        };

        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
        fixedThreadPool.execute(command);
    
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        cachedThreadPool.execute(command);
    
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
        // 2000ms后執(zhí)行command
        scheduledThreadPool.schedule(command, 2000, TimeUnit.MILLISECONDS);
        // 延遲10ms后,每隔1000ms執(zhí)行一次command
        scheduledThreadPool.scheduleAtFixedRate(command, 10, 1000, TimeUnit.MILLISECONDS);

        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        singleThreadExecutor.execute(command);
    }

參考:
《Android開發(fā)藝術(shù)探索》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末牵祟,一起剝皮案震驚了整個濱河市深夯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诺苹,老刑警劉巖咕晋,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異收奔,居然都是意外死亡掌呜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門坪哄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來质蕉,“玉大人,你說我怎么就攤上這事损姜∈伟” “怎么了殊霞?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵摧阅,是天一觀的道長。 經(jīng)常有香客問我绷蹲,道長棒卷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任祝钢,我火速辦了婚禮比规,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拦英。我一直安慰自己蜒什,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布疤估。 她就那樣靜靜地躺著灾常,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铃拇。 梳的紋絲不亂的頭發(fā)上钞瀑,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音慷荔,去河邊找鬼雕什。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贷岸。 我是一名探鬼主播壹士,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凰盔!你這毒婦竟也來了墓卦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤户敬,失蹤者是張志新(化名)和其女友劉穎落剪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尿庐,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡忠怖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抄瑟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凡泣。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖皮假,靈堂內(nèi)的尸體忽然破棺而出鞋拟,到底是詐尸還是另有隱情,我是刑警寧澤惹资,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布贺纲,位于F島的核電站,受9級特大地震影響褪测,放射性物質(zhì)發(fā)生泄漏猴誊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一侮措、第九天 我趴在偏房一處隱蔽的房頂上張望懈叹。 院中可真熱鬧,春花似錦分扎、人聲如沸澄成。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽墨状。三九已至,卻和暖如春庵佣,著一層夾襖步出監(jiān)牢的瞬間歉胶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工巴粪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留通今,地道東北人粥谬。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像辫塌,于是被迫代替她去往敵國和親漏策。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容