線程池的優(yōu)點:
1.重用線程池中的線程,避免因為線程的創(chuàng)建和銷毀所帶來的性能開銷。
2.能有效控制線程池的最大并發(fā)數(shù),避免大量的線程之間因互相搶占系統(tǒng)資源而導致的阻塞現(xiàn)象。
3.能夠對線程進行簡單的管理,并提供定時執(zhí)行以及指定間隔循環(huán)執(zhí)行等功能。
Android中線程池的概念來源于Java中的Executor,Executor是一個接口,真正的線程池的實現(xiàn)為ThreadPoolExecutor。ThreadPoolExecutor提供了一系列參數(shù)來配置線程池,通過不同的參數(shù)可以創(chuàng)建不同的線程池。從功能上來說,Android的線程池主要分為4類,這4類線程池可以通過Executors所提供的工廠方法來得到。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory);
corePollSize: 線程池的核心線程數(shù),默認情況下,核心線程會在線程池中一直存活,即使它們處于閑置狀態(tài)。如果將ThreadPoolExecutor的allowCoreThreadTimeOut屬性設置為true,那么閑置的核心線程在等待新任務到來時會有超時策略,這個時間間隔有keepAliveTime所指定,當?shù)却龝r間超過keepAliveTime所指定的時長后,核心線程就會終止(也就是閑置超過這個時間會終止)。
maximumPoolSize:線程池所能容納的最大線程數(shù),當活動線程數(shù)達到這個數(shù)值后,后續(xù)的新任務將會被阻塞。
keepAliveTime:非核心線程閑置時的超時時長,超過這個時長,非核心線程就會被回收。當ThreadPoolExecutor的allowCoreThreadTimeOut屬性設置為true,keepAliveTime也會作用于核心線程。
unit:用于指定keepAliveTime參數(shù)的時間單位,這是一個枚舉,常用的有TimeUnit.MILLISENCONDS(毫秒),TimeUnit.SECONDS(秒)以及TimeUnit.MINUTES(分鐘)等。
workQueue:線程池的任務隊列,通過線程池的execute方法提交的Runnable對象會存儲在這個參數(shù)中。
threadFactory:線程工廠,為線程池提供創(chuàng)建新線程的功能。ThreadFactory是一個接口,它只有一個方法:Thread newThread(Runnable r)。
出了上面這些主要的參數(shù)外,ThreadPoolExecutor還有一個不常用的參數(shù)RejectedExecutionHandler handler。當線程池無法執(zhí)行新任務時,這可能是由于任務隊列已滿或者是無法成功執(zhí)行任務,這個時候ThreadPoolExecutor會調用handler的rejectedExecution方法來通知調用者,默認情況下rejectedExecution方法會直接拋出RejectedExecutionException異常。ThreadPoolExecutor為RejectedExecutionHandler提供了幾個可選值,其中AbortPolicy是默認值,它會直接拋出RejectedExecutionException。
ThreadPoolExecutor執(zhí)行任務時大致遵循以下規(guī)則:
(1)如果線程池中的線程數(shù)量未達到核心線程的數(shù)量,那么會直接啟動一個核心線程來執(zhí)行任務。
(2)如果線程池中的線程數(shù)量已經達到或者超過核心線程的數(shù)量,那么任務會被插入到任務隊列中排隊等待執(zhí)行。
(3)如果在步驟2中無法將任務插入到任務隊列中,這往往是由于任務隊列已滿,這個時候如果線程數(shù)量未達到線程池規(guī)定的最大值,那么會立刻啟動一個非核心線程來執(zhí)行任務。
(4)如果和步驟3中線程數(shù)量已經達到線程池規(guī)定的最大值,那么就拒絕執(zhí)行此任務,ThreadPoolExecutor會調用RejectedExecutionHandler的RejectedExecution方法來通知調用者。