Android中的四大線程池特點(diǎn)介紹和適用場景

? ? 在日常應(yīng)用開發(fā)中,經(jīng)常會有一些耗時(shí)操作,比如數(shù)據(jù)庫操作、網(wǎng)絡(luò)請求等,碰見這種情況,我們一般會怎么做呢?當(dāng)然第一反應(yīng)就是放到子線程去異步處理,張手就一個(gè)new Thread().start就來了,這樣的操作在線程少的情況下是沒問題的,也能實(shí)現(xiàn)功能,但這樣久之會造成嚴(yán)重的性能損耗,有的同學(xué)就會問為什么?我告訴你為什么,原因如下:

? ? 一、JAVA線程機(jī)制是搶占性質(zhì)的,new Thread出來的匿名線程非常難以管理,都是些野猴子,缺乏管束,雖然JAVA提供了線程優(yōu)先級的方法,但通常效果并不理想,有時(shí)候就很混亂,而且JAVA線程機(jī)制會給每個(gè)線程提供時(shí)間片,“野”線程多了,自然會影響耗能。

? ? 二、JAVA中你每次new Thread的時(shí)候,在難以管理的情形下,銷毀線程的性能是很差的,而線程池復(fù)用線程的特性極大的提高了效率和性能。

? ? 三、new Thread功能比較單一,沒有定時(shí)執(zhí)行、線程中斷等功能。

? ? 好了,上面三點(diǎn)就是原因了,所以線程池還是很有必要的,接下來我們來介紹一下吧。

在JAVA JDK1.5上提供了Executor框架,這框架就是用來把任務(wù)的提交和執(zhí)行解耦,其核心成員就是ThreadPoolExecutor,這也是線程池的核心實(shí)現(xiàn)類。其構(gòu)造方法如下:


? ? ?corePoolSize ??

? ? ?表示核心線程數(shù),默認(rèn)情況下,線程池是空的,只有提交任務(wù)的時(shí)候才會創(chuàng)建線程,核心線程會在線程池中一直存活,只不過是處于閑置狀態(tài),除非你把ThreadPoolExecutor的allowCoreThreadTimeOut屬性設(shè)為true,就會有超時(shí)策略,即核心線程的生命周期會受keepAliveTime的限制,時(shí)間一到,就會終止。還有,如果你調(diào)用線程池的prestartAllCoreThread方法,線程池就會提前重新創(chuàng)建并啟動(dòng)所有的核心線程去等待任務(wù)。

? ? ?maximumPoolSize

? ? ?表示允許線程池創(chuàng)建的最大線程數(shù)。當(dāng)活動(dòng)的線程小于maximumPoolSize設(shè)定的線程數(shù),就創(chuàng)建線程執(zhí)行任務(wù),否則新任務(wù)被阻塞,排隊(duì)等待。

? ? ?keepAliveTime

? ? ?表示非核心線程閑置的超時(shí)時(shí)長,超過時(shí)間則會被回收。如果遇見任務(wù)短而且很多的情況,你可以通過調(diào)大這個(gè)屬性值來提高線程的利用率。

? ? ?TimeUnit

? ? ?表示keepAliveTime的時(shí)間單位,這是一個(gè)枚舉,從天(DAYS)到納秒(NANOSECONDS)。

? ? ?workQueue

? ? ?表示一個(gè)阻塞的任務(wù)隊(duì)列,線程池的execute方法提交的Runnable對象會存儲在這個(gè)參數(shù)中,阻塞隊(duì)列的概念就不說了,大家自行百度。

? ? ?ThreadFactory

? ? ?表示線程工廠,線程池在創(chuàng)建線程的就是用的它,用Thread newThread(Runnable r)來執(zhí)行創(chuàng)建線程操作。

? ? ?RejectedExecutionHandler

? ? 表示線程池的飽和策略,用于線程池和任務(wù)隊(duì)列滿了的情況下使用的策略,默認(rèn)是abordPolicy,表示無法處理新任務(wù),這個(gè)時(shí)候ThreadPoolExecutor會調(diào)用handler的rejectedExecution方法通知調(diào)用者,并會直接拋出一個(gè)RejectedExecutionException,此外還有三種策略,分別是CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy,這些東西并不常用,但我想這個(gè)還是有必要普及一下,

(1)CallerRunsPolicy:用調(diào)用者所在的線程處理任務(wù),也就是說,放下手中的活幫我處理掉的意思。

(2)DiscardPolicy:直接拋棄新任務(wù)

(3)DiscardOldestPolicy:丟棄隊(duì)列中最近的任務(wù),并執(zhí)行新任務(wù)

好了,關(guān)于ThreadPoolExecutor的介紹就到這里,下面我們來看看它的幾位小弟吧。

FixedThreadPool


這類線程池的特點(diǎn)就是里面全是核心線程,沒有非核心線程,也沒有超時(shí)機(jī)制,任務(wù)大小也是沒有限制的,數(shù)量固定,即使是空閑狀態(tài),線程不會被回收,除非線程池被關(guān)閉,從構(gòu)造方法也可以看出來,只有兩個(gè)參數(shù),一個(gè)是指定的核心線程數(shù),一個(gè)是線程工廠,keepAliveTime無效。任務(wù)隊(duì)列采用了無界的阻塞隊(duì)列LinkedBlockingQueue,執(zhí)行execute方法的時(shí)候,運(yùn)行的線程沒有達(dá)到corePoolSize就創(chuàng)建核心線程執(zhí)行任務(wù),否則就阻塞在任務(wù)隊(duì)列中,有空閑線程的時(shí)候去取任務(wù)執(zhí)行。由于該線程池線程數(shù)固定,且不被回收,線程與線程池的生命周期同步,所以適用于任務(wù)量比較固定但耗時(shí)長的任務(wù)。


CachedThreadPool


這類線程池的特點(diǎn)就是里面沒有核心線程,全是非核心線程,其maximumPoolSize設(shè)置為Integer.MAX_VALUE,線程可以無限創(chuàng)建,當(dāng)線程池中的線程都處于活動(dòng)狀態(tài)的時(shí)候,線程池會創(chuàng)建新的線程來處理新任務(wù),否則會用空閑的線程來處理新任務(wù),這類線程池的空閑線程都是有超時(shí)機(jī)制的,keepAliveTime在這里是有效的,時(shí)長為60秒,超過60秒的空閑線程就會被回收,當(dāng)線程池都處于閑置狀態(tài)時(shí),線程池中的線程都會因?yàn)槌瑫r(shí)而被回收,所以幾乎不會占用什么系統(tǒng)資源。任務(wù)隊(duì)列采用的是SynchronousQueue,這個(gè)隊(duì)列是無法插入任務(wù)的,一有任務(wù)立即執(zhí)行,所以CachedThreadPool比較適合任務(wù)量大但耗時(shí)少的任務(wù)。


ScheduledThreadPool


這類線程池核心線程數(shù)量是固定的,好像和FixThreadPool有點(diǎn)像,但是它的非核心線程是沒有限制的,并且非核心線程一閑置就會被回收,keepAliveTime同樣無效,因?yàn)楹诵木€程是不會回收的,當(dāng)運(yùn)行的線程數(shù)沒有達(dá)到corePoolSize的時(shí)候,就新建線程去DelayedWorkQueue中取ScheduledFutureTask然后才去執(zhí)行任務(wù),否則就把任務(wù)添加到DelayedWorkQueue,DelayedWorkQueue會將任務(wù)排序,按新建一個(gè)非核心線程順序執(zhí)行,執(zhí)行完線程就回收,然后循環(huán)。任務(wù)隊(duì)列采用的DelayedWorkQueue是個(gè)無界的隊(duì)列,延時(shí)執(zhí)行隊(duì)列任務(wù)。綜合來說,這類線程池適用于執(zhí)行定時(shí)任務(wù)和具體固定周期的重復(fù)任務(wù)。


SingleThreadPool


這類線程池顧名思義就是一個(gè)只有一個(gè)核心線程的線程池,從構(gòu)造方法來看,它可以單獨(dú)執(zhí)行,也可以與周期線程池結(jié)合用。其任務(wù)隊(duì)列是LinkedBlockingQueue,這是個(gè)無界的阻塞隊(duì)列,因?yàn)榫€程池里只有一個(gè)線程,就確保所有的任務(wù)都在同一個(gè)線程中順序執(zhí)行,這樣就不需要處理線程同步的問題。這類線程池適用于多個(gè)任務(wù)順序執(zhí)行的場景。


It's over!相信到這里,四大線程池的特點(diǎn)已經(jīng)很清晰了,歡迎大家吐嘈!

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

相關(guān)閱讀更多精彩內(nèi)容

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