線程池簡(jiǎn)介:
android提供了四種線程池,都是由直接或簡(jiǎn)介配置ThreadPoolExecutor來(lái)實(shí)現(xiàn)的。
線程池存在的意義:
1.重用線程池中的線程,來(lái)減少開啟線程和關(guān)閉線程的性能開銷。
2.控制線程數(shù)量,避免大量的線程搶占系統(tǒng)資源而引起的堵塞現(xiàn)象,表現(xiàn)為手機(jī)卡頓。
3.對(duì)線程做到簡(jiǎn)單的管理,提供定時(shí)執(zhí)行或指定間隔循環(huán)執(zhí)行等功能。
ThreadPoolExecutor
實(shí)現(xiàn)了來(lái)自Executor接口。
public interface Executor {
void execute(Runnable command);
}
重要參數(shù):
1.corePoolSize:核心線程的數(shù)量,默認(rèn)核心線程在線程池中一直存活,即便處于閑置狀態(tài),但當(dāng)設(shè)置allowCoreThreadTimeOut 為ture 他就會(huì)和非核心線程一樣,受keepAliveTime控制。
2.maximunPoolSize:最大線程數(shù)。核心線程+非核心線程。
3.allowCoreThreadTimeOut:剛剛說(shuō)過(guò)。。
4.keepAliveTime:時(shí)間
5.TimeUnit:時(shí)間單位
6.ThreadFactory:線程工廠,創(chuàng)建線程的方式。本身是一個(gè)接口,只有一個(gè)方法。
7.blockingQueue<runnable> :任務(wù)隊(duì)列。
工作流程:
1.線程池的線程數(shù)量沒有達(dá)到核心線程數(shù),創(chuàng)建新的核心線程執(zhí)行任務(wù)。
2.線程池?cái)?shù)量達(dá)到核心線程數(shù),把任務(wù)插入任務(wù)隊(duì)列中。
3.任務(wù)隊(duì)列也滿了,開啟非核心線程來(lái)執(zhí)行任務(wù)。
4.線程池總線程數(shù)達(dá)到上限,該任務(wù)不執(zhí)行,線程池通過(guò)RejectExecuteHandler的rejectExecute方法通知調(diào)用者。
小demo
/**
* 串行執(zhí)行多線程任務(wù) 第一種 使用線程池
*/
//任務(wù)隊(duì)列。android 提供有:LinkedBlockingQueue ArrayQueue ArrayBlockQueue 區(qū)別自己百度吧。
LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);
//線程工廠
ThreadFactory threadFactory = new ThreadFactory(){
@Override
public Thread newThread(@NonNull Runnable r) {
return new Thread(r);
}
};
//設(shè)置一個(gè)核心線程數(shù)為1,最大線程數(shù)為5,任務(wù)隊(duì)列最大容量為100,閑置關(guān)閉時(shí)間為1秒的線程池
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 5, 1l, java.util.concurrent.TimeUnit.SECONDS, workQueue, threadFactory);
public void executeByExecutor(Runnable runnable){
threadPoolExecutor.execute(runnable);
}
android中的四種線程池。
FixedThreadPool:線程總數(shù)就是核心線程數(shù),不設(shè)置閑置超時(shí)關(guān)閉。使用LinkedBlockingQueue并且不設(shè)置最大任務(wù)數(shù)。 能夠極快的響應(yīng)外界請(qǐng)求。
CachedThreadPool:線程總數(shù)就是非核心線程數(shù),核心線程數(shù)為0,并且數(shù)量為Integer.Max_VALUE,有超時(shí)時(shí)間,60s,使用SynchronousQueue,實(shí)際上這個(gè)任務(wù)隊(duì)列并不能存儲(chǔ)元素。閑置時(shí)不占用過(guò)多資源,適合執(zhí)行大量的耗時(shí)較少的任務(wù)。
ScheduleThreadPool:核心線程數(shù)固定,非核心線程數(shù)是Integer.MAX_VALUE,非核心線程閑置時(shí)會(huì)被馬上回收,閑置超時(shí)時(shí)間是0,使用DelayedWorkQueue(),主要用于執(zhí)行定時(shí)任務(wù)和具有固定周期的重復(fù)任務(wù)。
singleThreadPool:一個(gè)核心線程,沒有非核心線程,使用LinkedBlockingQueue不設(shè)置隊(duì)列長(zhǎng)度,目的是把所有任務(wù)放到一個(gè)線程中按順序執(zhí)行,實(shí)現(xiàn)了串行并且不需要考慮同步的問(wèn)題。