Android中線程分為主線程和子線程,主線程主要處理和界面相關(guān)的事情,子線程則往往用于執(zhí)行耗時操作。
1.1、AsyncTask
AsyncTask是一種輕量級的異步任務(wù)類,他可以在線程池中執(zhí)行后臺任務(wù),然后把執(zhí)行的進度和最終結(jié)果傳遞給主線程并在主線程中更新UI。AsyncTask封裝了Thread和Handler。AsyncTask并不適合特別耗時的后臺任務(wù),特別耗時的任務(wù)建議使用線程池。
AsyncTask是一個抽象的泛型類,他提供了Params、Progress和Result這三個泛型參數(shù)。其中Params表示參數(shù)的類型,Progress表示后臺任務(wù)的執(zhí)行進度的類型,而Result則表示后臺任務(wù)的返回結(jié)果的類型。如果不需要傳遞參數(shù),這三個泛型參數(shù)可以用Void代替。
public? abstract? class? AsyncTask<Params,Progress,Result>
四個核心方法:
1)onPreExecute()在主線程中執(zhí)行,在異步任務(wù)執(zhí)行之前此方法會被調(diào)用,一般用于準(zhǔn)備工作。
2) doInBackground(Params ...params) 在線程池中執(zhí)行,此方法用于執(zhí)行異步任務(wù),Params 參數(shù)表示異步任務(wù)的輸入?yún)?shù)。此方法中可以通過publishProgress方法來更新任務(wù)的進度,publishProgress方法會調(diào)用onProgressUpdate方法。此方法需要返回計算結(jié)果給onPostExecute方法。
3)onProgressUpdate(Progress...values),在主線程中執(zhí)行,當(dāng)后臺任務(wù)的執(zhí)行進度發(fā)生改變時此方法被調(diào)用。
4)onPostExecute(Result result)在主線程中執(zhí)行,在異步任務(wù)執(zhí)行之后此方法會被調(diào)用,其中result參數(shù)是后臺任務(wù)的返回值,即doInBackground的返回值。
此外,AsyncTask還提供了onCancelled()方法,在主線程執(zhí)行,當(dāng)異步任務(wù)被取消時會被調(diào)用,此時onPostExecute方法不會被調(diào)用。
//execute()和executeOnExecutor( , )區(qū)別是:3.0以上 一個是串行? /? 一個是并行
1.2、HandlerThread
HandlerThread繼承Thread,它是一種可以使用Handler的Thread。實現(xiàn):在run方法中通過Looper.prepare()來創(chuàng)建消息隊列,并通過Looper.loop()來開啟消息循環(huán),這樣就允許在HandlerThread中創(chuàng)建Handler了。
普通的Thread主要用于在run方法中執(zhí)行一個耗時任務(wù),而HandlerThread在內(nèi)部創(chuàng)建了消息隊列,外界需要通過Handler的消息方式來通知HandlerThread執(zhí)行一個具體的任務(wù)。
由于HandlerThread的run方法是一個無限循環(huán),因此當(dāng)明確不需要再使用HandlerThread時,可以通過它的quit或者quitSafely方法來終止線程的執(zhí)行。
1.3、IntentService
IntentService可用于執(zhí)行后臺耗時的任務(wù),當(dāng)任務(wù)執(zhí)行后它會自動停止,同時由于它是服務(wù)的原因,它的優(yōu)先級比單純的線程要高很多。所以IntentService比較適合執(zhí)行一些高優(yōu)先級的后臺任務(wù)。
IntentService封裝了HandlerThread和Handler。
1.4、Android中的線程池
線程池的好處:
1)重用線程池中的線程,避免因為線程池的創(chuàng)建和銷毀所帶來的性能開銷。
2)能有效控制線程池的最大并發(fā)數(shù),避免大量的線程之間因相互搶占系統(tǒng)資源而導(dǎo)致的阻塞現(xiàn)象。
3)能夠?qū)€程進行簡單的管理,并提供定時執(zhí)行以及指定間隔循環(huán)執(zhí)行等功能。
1.4.1、ThreadPoolExecutor
ThreadPoolExecutor是線程池的真正實現(xiàn)。
public ThreadPoolExecutor(int corePoolSize,
??????????????????????????????????????????? int? maximumPoolSize,
??????????????????????????????????????????? long keepAliveTime,
???????????????????????????????????????????? TimeUnit??? unit,
???????????????????????????????????????????? BlockingQueue<Runnable>? workQueue,
???????????????????????????????????????????? ThreadFactory? threadFactory
)
corePoolSize 線程池的核心線程數(shù),默認(rèn)核心線程會在線程池中一直存活,即使他們處于閑置狀態(tài)。如果將ThreadPoolExecutor的allowCoreThreadTimeOut屬性設(shè)置為true,那么閑置的核心線程在等待新的任務(wù)到來時會有超時策略,這個時間間隔由keepAliveTime所指定,當(dāng)?shù)却龝r間超過keepAliveTime所指定的時長后,核心線程就會被終止。
maximumPoolSize? 線程池所能容納的最大線程數(shù),當(dāng)活動線程數(shù)達到這個數(shù)值后,后續(xù)的新任務(wù)將會被阻塞。
keepAliveTime 非核心線程閑置時的超時時長,超過這個時長,非核心線程就會被回收。當(dāng)ThreadPoolExecutor的allowCoreThreadTimeOut屬性設(shè)置為true時,keepAliveTime 同樣會作用于核心線程。
unit?? 用于指定keepAliveTime 參數(shù)的時間單位,是個枚舉。常用的有TimeUnit.MILLISECONDS(ms)、TimeUnit.SECONDS(s)、TimeUnit.MINUTES(分鐘)等。
workQueue 線程池中的任務(wù)隊列,通過線程池的execute方法提交的Runnable對象會存儲在這個參數(shù)中。
threadFactory? 線程工廠,為線程池提供創(chuàng)建新的線程的功能。ThreadFactory是一個接口,它只有一個方法:Thread newThread(Runnable r) 。
未達到核心線程數(shù)量,直接啟動核心線程;超過了核心線程數(shù)量,任務(wù)被插入任務(wù)隊列中排隊。
如果隊列已滿,線程數(shù)量未達到最大線程數(shù),會立刻啟動一個非核心線程來執(zhí)行任務(wù);若已達到線程池規(guī)定的最大值就會拒絕執(zhí)行任務(wù),并通知調(diào)用者。
1.4.2、線程池的分類
1)?? FixedThreadPool??? 通過Executors的newFixedThreadPool方法來創(chuàng)建。它是一種線程數(shù)量固定的線程池,當(dāng)線程處于空閑狀態(tài)是,它們并不會被回收,除非線程池被關(guān)閉了。FixedThreadPool只有核心線程并且這些核心線程不會被回收。核心線程沒有超時機制,另外任務(wù)隊列也沒有大小限制。
2)CachedThreadPool??? 通過Executors的newCachedThreadPool 方法來創(chuàng)建。線程數(shù)量不定的線程池,只有非核心線程,最大線程數(shù)為Interger.MAX_VALUE??臻e線程的超時時長為60s。它適合執(zhí)行大量的耗時比較少的任務(wù)。當(dāng)整個線程池都處于閑置狀態(tài)時,線程池沒有任何線程,幾乎不占用資源。
3)ScheduledThreadPool???? 通過Executors的newScheduledThreadPool?方法來創(chuàng)建。它是一種核心線程數(shù)量固定的線程池,而非核心線程沒有限制。非核心線程空閑時立即被回收。主要用于執(zhí)行定時任務(wù)和具有固定周期的重復(fù)任務(wù)。
4)SingleThreadExecutor?????? 通過Executors的newSingleThreadExecutor?方法來創(chuàng)建。線程池內(nèi)部只有一個核心線程,它確保所有的任務(wù)都在同一個線程中順序執(zhí)行。SingleThreadExecutor 的意義在于統(tǒng)一所有的外界任務(wù)到一個線程中,使得在這些任務(wù)之間 不需要處理線程同步 的問題。