線程池的優(yōu)點(diǎn):
1.重用線程池中的線程禽炬,避免因?yàn)榫€程的創(chuàng)建和銷毀所帶來(lái)的性能開銷。
2.能有效控制線程池的最大并發(fā)數(shù)栓霜,避免大量的線程之間因互相搶占系統(tǒng)資源而導(dǎo)致的阻塞現(xiàn)象瘟栖。
3.能夠?qū)€程進(jìn)行簡(jiǎn)單的管理,并提供定時(shí)執(zhí)行以及指定間隔循環(huán)執(zhí)行等功能蜡豹。
Android中線程池的概念來(lái)源于Java中的Executor麸粮,Executor是一個(gè)接口,真正的線程池的實(shí)現(xiàn)為ThreadPoolExecutor镜廉。ThreadPoolExecutor提供了一系列參數(shù)來(lái)配置線程池豹休,通過不同的參數(shù)可以創(chuàng)建不同的線程池。從功能上來(lái)說(shuō)桨吊,Android的線程池主要分為4類威根,這4類線程池可以通過Executors所提供的工廠方法來(lái)得到。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory);
corePollSize: 線程池的核心線程數(shù)视乐,默認(rèn)情況下洛搀,核心線程會(huì)在線程池中一直存活,即使它們處于閑置狀態(tài)佑淀。如果將ThreadPoolExecutor的allowCoreThreadTimeOut屬性設(shè)置為true留美,那么閑置的核心線程在等待新任務(wù)到來(lái)時(shí)會(huì)有超時(shí)策略,這個(gè)時(shí)間間隔有keepAliveTime所指定伸刃,當(dāng)?shù)却龝r(shí)間超過keepAliveTime所指定的時(shí)長(zhǎng)后谎砾,核心線程就會(huì)終止(也就是閑置超過這個(gè)時(shí)間會(huì)終止)。
maximumPoolSize:線程池所能容納的最大線程數(shù)捧颅,當(dāng)活動(dòng)線程數(shù)達(dá)到這個(gè)數(shù)值后景图,后續(xù)的新任務(wù)將會(huì)被阻塞。
keepAliveTime:非核心線程閑置時(shí)的超時(shí)時(shí)長(zhǎng)碉哑,超過這個(gè)時(shí)長(zhǎng)挚币,非核心線程就會(huì)被回收。當(dāng)ThreadPoolExecutor的allowCoreThreadTimeOut屬性設(shè)置為true扣典,keepAliveTime也會(huì)作用于核心線程妆毕。
unit:用于指定keepAliveTime參數(shù)的時(shí)間單位,這是一個(gè)枚舉贮尖,常用的有TimeUnit.MILLISENCONDS(毫秒)笛粘,TimeUnit.SECONDS(秒)以及TimeUnit.MINUTES(分鐘)等。
workQueue:線程池的任務(wù)隊(duì)列,通過線程池的execute方法提交的Runnable對(duì)象會(huì)存儲(chǔ)在這個(gè)參數(shù)中薪前。
threadFactory:線程工廠润努,為線程池提供創(chuàng)建新線程的功能。ThreadFactory是一個(gè)接口序六,它只有一個(gè)方法:Thread newThread(Runnable r)。
出了上面這些主要的參數(shù)外蚤吹,ThreadPoolExecutor還有一個(gè)不常用的參數(shù)RejectedExecutionHandler handler例诀。當(dāng)線程池?zé)o法執(zhí)行新任務(wù)時(shí),這可能是由于任務(wù)隊(duì)列已滿或者是無(wú)法成功執(zhí)行任務(wù)裁着,這個(gè)時(shí)候ThreadPoolExecutor會(huì)調(diào)用handler的rejectedExecution方法來(lái)通知調(diào)用者繁涂,默認(rèn)情況下rejectedExecution方法會(huì)直接拋出RejectedExecutionException異常。ThreadPoolExecutor為RejectedExecutionHandler提供了幾個(gè)可選值二驰,其中AbortPolicy是默認(rèn)值扔罪,它會(huì)直接拋出RejectedExecutionException。
ThreadPoolExecutor執(zhí)行任務(wù)時(shí)大致遵循以下規(guī)則:
(1)如果線程池中的線程數(shù)量未達(dá)到核心線程的數(shù)量桶雀,那么會(huì)直接啟動(dòng)一個(gè)核心線程來(lái)執(zhí)行任務(wù)矿酵。
(2)如果線程池中的線程數(shù)量已經(jīng)達(dá)到或者超過核心線程的數(shù)量,那么任務(wù)會(huì)被插入到任務(wù)隊(duì)列中排隊(duì)等待執(zhí)行矗积。
(3)如果在步驟2中無(wú)法將任務(wù)插入到任務(wù)隊(duì)列中全肮,這往往是由于任務(wù)隊(duì)列已滿,這個(gè)時(shí)候如果線程數(shù)量未達(dá)到線程池規(guī)定的最大值棘捣,那么會(huì)立刻啟動(dòng)一個(gè)非核心線程來(lái)執(zhí)行任務(wù)辜腺。
(4)如果和步驟3中線程數(shù)量已經(jīng)達(dá)到線程池規(guī)定的最大值,那么就拒絕執(zhí)行此任務(wù)乍恐,ThreadPoolExecutor會(huì)調(diào)用RejectedExecutionHandler的RejectedExecution方法來(lái)通知調(diào)用者评疗。