線程池:
? ? ? ?一個線程池中會緩存一定數(shù)量的線程网沾,通過線程池就可以避免因為頻繁創(chuàng)建和銷毀線程所帶來的系統(tǒng)開銷。Android中的線程池來源于Java,主要是通過Executor來派生特定類型的線程池淋叶。
? 優(yōu)點: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?1破喻、重用的線程池中的線程墨闲,避免因為線程的創(chuàng)建和銷毀所帶來的性能開銷佩迟。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2、避免大量的線程間因互相搶占系統(tǒng)資源導致的阻塞現(xiàn)象昏兆; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3枫虏、能夠?qū)€程進行簡單的管理并提供定時執(zhí)行,間隔執(zhí)行等功能爬虱;
? ? ? ?Android中的線程池來源于Executor,Executor是一個接口隶债,真正線程池實現(xiàn)為ThreadPoolExecutor,通過ThreadPoolExecutor提供的一系列參數(shù)來配置線程池,不同參數(shù)可以創(chuàng)建不同的線程池饮潦。其中Android中常見的四類具有不同功能的線程池為:FixThreadPool燃异、CachedThreadPool、ScheduledThreadPooI继蜡、SingThreadExecutor回俐。除了以上四種線程池外逛腿,我們可以根據(jù)情況自己設置參數(shù)自定義線程池。 ?
? ? ? ?首先我們先了解一下Android中ThreadPoolExecutor仅颇,它的構造方法提供了一系列參數(shù)來配置線程池单默。下面是一個比較常用的構造方法。
corePoolSize:核心線程數(shù)忘瓦,核心線程會一直存活搁廓,即使沒有任務需要處理。如果將ThreadPoolExecutor的allowCoreThreadTimeOut屬性設置為true耕皮,那么閑置的核心線程在等待新任務到來時會有超時策略境蜕,這個時間間隔由keepAliveTime所指定,當?shù)却龝r間超過keepAliveTime所指定的時長后凌停,核心線 程就會被終止粱年。
maximumPoolSize:線程池所能容納的最大線程數(shù),當活動線程數(shù)達到這個數(shù)值后罚拟,后續(xù)的新任務將會被阻塞台诗。
keepAliveTime:當線程空閑時間達到keepAliveTime,該線程會退出赐俗,直到線程數(shù)量等于corePoolSize拉队。如果allowCoreThreadTimeout設置為true,則所有線程均會退出直到線程數(shù)量為0阻逮。
unit:用于指定keepAliveTime參數(shù)的時間單位粱快,這是一個枚舉,常用的有
TimeUnit.MILLISECONDS夺鲜、TimeUnit.SECOND皆尔、TimeUnit.MINUTES。
workQueue:線程池中的任務隊列币励,通過線程池的execute方法提交的Runnable對象會存儲在這個參數(shù)中。
threadFactory:線程工廠珊拼,為線程池提供創(chuàng)建新線程的功能食呻。
ThreadPoolExecutor執(zhí)行任務時大致遵循如下規(guī)則 : ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.如果線程池中的數(shù)量未達到核心線程的數(shù)量,那么會直接啟動一個核心線程來執(zhí)行任務澎现。
? ? ?2.如果線程池中的線程數(shù)量已經(jīng)到或者超過核心線程的數(shù)量仅胞,那么任務會被插入到任務隊列中排隊等待執(zhí)行。
? ? ?3.如果在步驟2中無法將任務插入到任務隊列中剑辫,這往往是由于任務隊列已滿干旧,這個時候如果線程數(shù)量未達到線程池規(guī)定的最大值,那么會立刻啟動一個非核心線程來執(zhí)行妹蔽。
? ? ?4.如果步驟3中線程數(shù)量已經(jīng)達到線程池規(guī)定的最大值椎眯,那么就拒絕執(zhí)行此任務挠将,ThreadPoolExecutor會調(diào)用RejectedExecutionHandler的rejectedExecution方法來通知調(diào)用者。
四類常見線程池:
1编整、FixedThreadPool:通過Executors的newFixedThreadPool方法來創(chuàng)建舔稀。它是一種線程數(shù)量固定的線程池,當線程處于空閑狀態(tài)時掌测,它們并不會被回收内贮,除非線程池被關閉了。FixedThreadPool中只有核心線程并且這些核心線程沒有超時機制汞斧,另外任務隊列也是沒有大小限制的夜郁。
程序中調(diào)用:
2、CachedThreadPool:它是一種線程數(shù)量不定的線程池粘勒,最大線程數(shù)可以任意大舱痘。這類線程池比較適合執(zhí)行大量的耗時較少的任務。當整個線程池處于閑置狀態(tài)時偿凭,線程池中的線程都會超時而被停止杠巡,這個時候CachedThreadPool之中實際是沒有任何線程的,它幾乎不占用任何系統(tǒng)資源埃撵。
程序中調(diào)用:
3.ScheduledThreadPool:它的核心線程數(shù)量是固定的赵颅,而非核心線程數(shù)量是沒有限制的,并且當非核心線程閑置時會被立即回收暂刘。這類線程池主要用于執(zhí)行定時任務和具有固定周期的重復任務饺谬。
程序中調(diào)用:
4、SingleThreadExecutor:它的線程池內(nèi)部只有一個核心線程谣拣,它確保所有的任務都在同一個線程中按順序執(zhí)行。其意義在于統(tǒng)一所有的外界任務到一個線程中森缠,使得在這些任務之間不需要處理線程同步的問題。
程序中調(diào)用:
自定義線程池:
代碼中的注釋已經(jīng)詳細講解了線程池的實現(xiàn)方式贵涵,在此不再傲述。