1.主線程和子線程
11.2Android中的線程形態(tài)
11.2.1 AsyncTask
AsyncTask 是一個(gè)抽象的泛型類,他提供了Params,Progress和Result三個(gè)泛型參數(shù)
Async提供了4個(gè)核心方法
1.onPreExecute() 2.doInbackGround() 3.onProgressUpdate() 4.onPostExecute
11.2.2AsyncTask的工作原理
11.2.3 HandlerThread
HandlerThread繼承了Thread,他是一個(gè)可以使用handler的Thread
在run方法中通過Looper.prepare()來創(chuàng)建消息隊(duì)列,并通過Looper.loop()來開啟消息循環(huán)。這就在實(shí)際實(shí)際使用中允許在handlerThread中創(chuàng)建handler。
11.2.4IntentService intentService是一種特殊的Service,它繼承了Service并且他是一個(gè)抽象類,所以必須創(chuàng)建它的子類才能使用IntentService。IntentService可用于執(zhí)行后臺(tái)耗時(shí)的任務(wù),當(dāng)任務(wù)執(zhí)行后他自動(dòng)停止。在實(shí)現(xiàn)上IntentService封裝了handlerThread和handler
當(dāng)intentService被第一次啟動(dòng)時(shí),他的increase方法會(huì)被調(diào)用,onCreate方法會(huì)創(chuàng)建一個(gè)handlerThread,然后使用它的Looper來構(gòu)造一個(gè)Handler對(duì)象mServiceHandler,這樣通過mServicehandler發(fā)送的消息最終都會(huì)在HandlerThread中執(zhí)行,從這個(gè)角度來說,IntentService也可以用于執(zhí)行后臺(tái)任務(wù)。每次啟動(dòng)intentService,它的onStartCommend方法就會(huì)調(diào)用一次。IntentService僅僅是通過mServiceHandler發(fā)送一個(gè)消息,這個(gè)消息在handlerThread中被處理。mServiceHandler收到消息后,會(huì)將Intent對(duì)象傳遞給OnhandlerIntent方法去處理
11.3 Android中的線程池
好處
1.重用線程池中的線程,避免因?yàn)榫€程的創(chuàng)建和銷毀所帶來的性能開銷
2.能有效控制線程池中的最大并發(fā)數(shù),避免大量的線程之間因?yàn)榛ハ鄵屨枷到y(tǒng)資源而導(dǎo)致的阻塞現(xiàn)象
3.能夠?qū)€程進(jìn)行簡(jiǎn)單的管理,并提供定時(shí)執(zhí)行以及制定間隔循環(huán)執(zhí)行等功能
11.3.1 ThreadPoolExecutor
threadPoolExecutor是線程池真正實(shí)現(xiàn),他的構(gòu)造方法提供了一系列參數(shù)來配置線程池
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory)
corePoolSize 線程的核心線程數(shù)
maximumPoolSize 線程池所能容納的最大線程數(shù)
keepAliveTime 非核心線程閑置時(shí)的超時(shí)時(shí)長(zhǎng)
unit 用來是定keepAliveTime參數(shù)的時(shí)間單位
workQueue 線程池中的任務(wù)隊(duì)列
threadFactory 線程工廠,為線程池提供新線程的功能
11.3.2線程池分類
1.FixedThreadPool 線程數(shù)量固定的線程池,當(dāng)線程處于空閑狀態(tài)時(shí),他們并不會(huì)被回收
2.CachedThreadPool 他是一種線程數(shù)量不定的線程池,他只有非核心線程,最大線程數(shù)量是Integer.MAX_VALUE
3.ScheduledThreadPool 他的核心線程數(shù)量是固定的,而非核心線程數(shù)是沒有限制的。并且當(dāng)非非核心線程閑置時(shí)會(huì)被立刻回收。ScheduledThreadPool這類線程池主要用于執(zhí)行定時(shí)任務(wù)和具有固定周期的重復(fù)任務(wù)
4.singleThreadExecutor 內(nèi)部只有一個(gè)核心線程,他確保所有的任務(wù)都在用一個(gè)線程中按順序執(zhí)行。