線程池

線程池簡(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)題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容