第十一章 Android的線程和線程池—學習筆記

概述

線程重要分為主線程和子線程,主線程主要處理和界面相關的事情,子線程一般用于執行耗時的操作。
Android中除了Thread以外,還有AsyncTask、IntentService、HandlerThread來扮演線程的要的角色。
盡管AsyncTask、IntentService、HandlerThread的表現形式有別于傳統的線程。但他們的本質還是傳統的線程。對于AsyncTask它底層用到的是線程池,IntentService和HandlerThread底層直接使用了線程。

不同線程形式的介紹:

AsyncTask:它封裝了線程池和Handler,它主要方便開發者在子線程中更新UI。
AsyncTask是一種輕量級的異步任務類,他可以線程池中執行后臺任務,然后把執行的進度和最終結果傳遞給主線程,并在主線程中更新UI。AsyncTask封裝的是Thread和Handler。但是AsyncTask并不適合特別耗時的后臺任務。
AsyncTask提供4個核心方法:
1.onPreExecute(),在主線程中執行,異步任務執行之前調用此方法。多用于做一些準備任務。
2.doInBackgroud(Params…params)在線程池中執行,此方法多用于執行異步任務。
3.onProgressUpdate(Progress..values)在主線程中執行,當后臺任務的執行進度發生變化的時候此方法被調用。
4.onPostExecute(Result result)主線程中執行,在一部異步任務執行之后,此方法會調用。result后后臺任務的返回值。

HandlerThread:是一種具有消息循環的線程,它的內部使用Handler。

IntentService:是一種服務,可以更方便的執行后臺任務,IntentService內部采用HandlerThread來執行任務。任務完成后自動退出。相對于后臺線程它不容易被殺死從而可以盡量保證任務的執行。IntentService是順序執行后臺任務的。

主線程和子線程

主線程是指進程所擁有的線程。默認情況只有一個進程和一個線程。除了主線程之外的線程都是子線程,也叫工作線程。

Android中線程池

線程池的好處:

1.重用線程池中的線程,避免因為線程的創建和銷毀所帶來的性能開銷。
2.有效控制線程池的最大并發數,避免大量的線程之間因互相搶占系統資源而導致的阻塞線程。
3.能對線程進行簡單的管理,并提供定時執行以及指定間隔循環執行等功能。

Android中線程池源自Java的Executor接口。真正的線程池實現為ThreadPoolExecutor。

ThreadPoolExecutor

ThreadPoolExecutor它的構造方法提供了一系列參數來配置線程池。
corePoolSize:線程池核心線程數量
maximumPoolSize:線程池所能容納的最大線程。
keepAliveTime:非核心線程的閑置超長時間,超過這個時間,非核心線程就會被回收。
unit:用于指定keepAliveTime參數的時間單位。
workQueue:線程池中的任務隊列
threadFactory:線程工廠,為線程池提供創建新線程的功能。

AsyncTask中線程池的配置:

核心線程數等于CPU核心數+1;
線程池的最大線程數CPU核心數2倍+1;
核心線程無超時機制,非核心線程閑置超時時間為1s
任務隊列的容量為128

線程池的分類

FixedThreadPool
Executors.newFixedThreadPool方法創建。他是一種固定線程數量的線程池,只有核心線程。這些線程不會被回收。除非線程池被關閉。
CachedThreadPool
Executors.newCachedThreadPool方法創建,它一種線程數量不固定的線程池。它只有非核心線程。并且它的線程都有超時機制,超過60秒閑置線程就會被回收。
ScheduledThreadPool
Executors.newScheduledThreadPool方法創建,它的核心數量是固定的,而非核心數量沒有限制。當非核心線程閑置是會立刻回收。
SingleThreadExecutor
Executors.newSingleThreadExecutor方法創建,它只要一個核心線程,能確保所有任務都在一個線程中按順序執行。它的意義在于統一所有的外界任務到一個線程中。是這些線程任務之間不需要處理線程同步的問題。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容