線程池:
? ? ? ?一個(gè)線程池中會(huì)緩存一定數(shù)量的線程,通過線程池就可以避免因?yàn)轭l繁創(chuàng)建和銷毀線程所帶來的系統(tǒng)開銷。Android中的線程池來源于Java,主要是通過Executor來派生特定類型的線程池。
? 優(yōu)點(diǎn): ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?1、重用的線程池中的線程,避免因?yàn)榫€程的創(chuàng)建和銷毀所帶來的性能開銷。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2、避免大量的線程間因互相搶占系統(tǒng)資源導(dǎo)致的阻塞現(xiàn)象; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3、能夠?qū)€程進(jìn)行簡(jiǎn)單的管理并提供定時(shí)執(zhí)行,間隔執(zhí)行等功能;
? ? ? ?Android中的線程池來源于Executor,Executor是一個(gè)接口,真正線程池實(shí)現(xiàn)為ThreadPoolExecutor,通過ThreadPoolExecutor提供的一系列參數(shù)來配置線程池,不同參數(shù)可以創(chuàng)建不同的線程池。其中Android中常見的四類具有不同功能的線程池為:FixThreadPool、CachedThreadPool、ScheduledThreadPooI、SingThreadExecutor。除了以上四種線程池外,我們可以根據(jù)情況自己設(shè)置參數(shù)自定義線程池。 ?
? ? ? ?首先我們先了解一下Android中ThreadPoolExecutor,它的構(gòu)造方法提供了一系列參數(shù)來配置線程池。下面是一個(gè)比較常用的構(gòu)造方法。

corePoolSize:核心線程數(shù),核心線程會(huì)一直存活,即使沒有任務(wù)需要處理。如果將ThreadPoolExecutor的allowCoreThreadTimeOut屬性設(shè)置為true,那么閑置的核心線程在等待新任務(wù)到來時(shí)會(huì)有超時(shí)策略,這個(gè)時(shí)間間隔由keepAliveTime所指定,當(dāng)?shù)却龝r(shí)間超過keepAliveTime所指定的時(shí)長(zhǎng)后,核心線 程就會(huì)被終止。
maximumPoolSize:線程池所能容納的最大線程數(shù),當(dāng)活動(dòng)線程數(shù)達(dá)到這個(gè)數(shù)值后,后續(xù)的新任務(wù)將會(huì)被阻塞。
keepAliveTime:當(dāng)線程空閑時(shí)間達(dá)到keepAliveTime,該線程會(huì)退出,直到線程數(shù)量等于corePoolSize。如果allowCoreThreadTimeout設(shè)置為true,則所有線程均會(huì)退出直到線程數(shù)量為0。
unit:用于指定keepAliveTime參數(shù)的時(shí)間單位,這是一個(gè)枚舉,常用的有
TimeUnit.MILLISECONDS、TimeUnit.SECOND、TimeUnit.MINUTES。
workQueue:線程池中的任務(wù)隊(duì)列,通過線程池的execute方法提交的Runnable對(duì)象會(huì)存儲(chǔ)在這個(gè)參數(shù)中。
threadFactory:線程工廠,為線程池提供創(chuàng)建新線程的功能。
ThreadPoolExecutor執(zhí)行任務(wù)時(shí)大致遵循如下規(guī)則 : ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.如果線程池中的數(shù)量未達(dá)到核心線程的數(shù)量,那么會(huì)直接啟動(dòng)一個(gè)核心線程來執(zhí)行任務(wù)。
? ? ?2.如果線程池中的線程數(shù)量已經(jīng)到或者超過核心線程的數(shù)量,那么任務(wù)會(huì)被插入到任務(wù)隊(duì)列中排隊(duì)等待執(zhí)行。
? ? ?3.如果在步驟2中無法將任務(wù)插入到任務(wù)隊(duì)列中,這往往是由于任務(wù)隊(duì)列已滿,這個(gè)時(shí)候如果線程數(shù)量未達(dá)到線程池規(guī)定的最大值,那么會(huì)立刻啟動(dòng)一個(gè)非核心線程來執(zhí)行。
? ? ?4.如果步驟3中線程數(shù)量已經(jīng)達(dá)到線程池規(guī)定的最大值,那么就拒絕執(zhí)行此任務(wù),ThreadPoolExecutor會(huì)調(diào)用RejectedExecutionHandler的rejectedExecution方法來通知調(diào)用者。
四類常見線程池:
1、FixedThreadPool:通過Executors的newFixedThreadPool方法來創(chuàng)建。它是一種線程數(shù)量固定的線程池,當(dāng)線程處于空閑狀態(tài)時(shí),它們并不會(huì)被回收,除非線程池被關(guān)閉了。FixedThreadPool中只有核心線程并且這些核心線程沒有超時(shí)機(jī)制,另外任務(wù)隊(duì)列也是沒有大小限制的。

程序中調(diào)用:

2、CachedThreadPool:它是一種線程數(shù)量不定的線程池,最大線程數(shù)可以任意大。這類線程池比較適合執(zhí)行大量的耗時(shí)較少的任務(wù)。當(dāng)整個(gè)線程池處于閑置狀態(tài)時(shí),線程池中的線程都會(huì)超時(shí)而被停止,這個(gè)時(shí)候CachedThreadPool之中實(shí)際是沒有任何線程的,它幾乎不占用任何系統(tǒng)資源。

程序中調(diào)用:

3.ScheduledThreadPool:它的核心線程數(shù)量是固定的,而非核心線程數(shù)量是沒有限制的,并且當(dāng)非核心線程閑置時(shí)會(huì)被立即回收。這類線程池主要用于執(zhí)行定時(shí)任務(wù)和具有固定周期的重復(fù)任務(wù)。

程序中調(diào)用:

4、SingleThreadExecutor:它的線程池內(nèi)部只有一個(gè)核心線程,它確保所有的任務(wù)都在同一個(gè)線程中按順序執(zhí)行。其意義在于統(tǒng)一所有的外界任務(wù)到一個(gè)線程中,使得在這些任務(wù)之間不需要處理線程同步的問題。

程序中調(diào)用:

自定義線程池:

代碼中的注釋已經(jīng)詳細(xì)講解了線程池的實(shí)現(xiàn)方式,在此不再傲述。