線程池

線程池

優點

  1. 重用線程池中的線程,避免因爲線程的創建和銷燬所帶來的性能開銷。
  2. 能有效控制線程池的最大併發數,避免大量的線程之間因互相搶佔系統資源而導致的阻塞現象。
  3. 能夠對線程進行簡單的管理,並提供定時執行以及指定間隔循環執行等功能。

ThreadPoolExecutor

  • Android中的線程池的概念來源於Java中的Executor,Executor是一個接口,真正的線程池的實現爲ThreadPoolExecutor。ThreadPoolExecutor提供了一系列參數來配置線程池,通過不同的參數可以創建不同的線程池,從線程池的功能特性上來說,Android的線程池主要分爲4類,這4類線程池都是直接或者間接通過配置ThreadPoolExecutor來實現的。

參數

ThreadPoolExecutor的構造方法提供了一系列參數來配置線程池,這些參數將會直接影響到線程池的功能特性。下面是AsyncTask中的 線程池的配置情況。

  1. corePoolSize:線程池的核心線程數,默認情況下,核心線程會在線程池中一直存活,即使它們處於閒置狀態。如果將ThreadPoolExecutor的allowCoreThreadTimeOut屬性設置爲true,那麼閒置的核心線程在等待新任務到來時會有超時策略,這個時間間隔由keepAliveTime所指定。
  2. maximumPoolSize:線程池所能容納的最大線程數,當活動線程數達到這個數值後,後續的新任務將會被阻塞。
  3. keepAliveTime:非核心線程閒置時的超時時長,超過這個時長,非核心線程就會被回收。當ThreadPoolExecutor的allowCoreThreadTimeOut屬性設置爲true時,keepAliveTime同樣會作用於核心線程。
  4. unit:用於指定keepAliveTime參數的時間單位,這是一個枚舉,常用的有TimeUnit.MILLISECONDS、TimeUnit.SECONDS以及TimeUnit.MINUTES等。
  5. workQueue:線程池中的任務隊列,通過線程池的execute方法提交的Runnable對象會存儲在這個參數中。
  6. threadFactory:線程工廠,爲線程池提供創建新線程的功能。ThreadFactory是一個接口,它只有一個方法:Thread newThread(Runnable)

規則:

  1. 如果線程池中的線程數量未達到核心線程的數量,那麼會直接啓動一個核心線程來執行任務。
  2. 如果線程池中的線程數量己經達到或者超過核心線程的數量,那麼任務會被插入到任務隊列中排隊等待執行。
  3. 如果在步驟2中無法將任務插入到任務隊列中,這往往是由於任務隊列巳滿,這個時候如果線程數量未達到線程池規定的最大值,那麼會立刻啓動一個非核心線程來執行任務。
  4. 如果步驟3中線程數量已經達到線程池規定的最大值,那麼就拒絕執行此任務。

四類線程池

  1. FixedThreadPool
    通過Executors的newFixedThreadPool方法來創建。它是一種線程數量固定的線程池,當線程處於空閒狀態時,它們並不會被回收,除非線程池被關閉了。當所有的線程都處於活動狀態時,新任務都會處於等待狀態,直到有線程空閒出來。由於FixedThreadPool只有核心線程並且這些核心線程不會被回收,這意味着它能夠 更加快速地響應外界的請求 。FixedThreadPool中只有核心線程並且這些核心線程沒有超時機制,另外任務隊列也是沒有大小限制的。
  2. CachedThreadPool
    通過Executors的newCachedThreadPool方法來創建。它是一種線程數量不定的線程池,它只有非核心線程,並且其最大線程數爲Integer.MAX_VALUE。當線程池中的線程都處於活動狀態時,線程池會創建新的線程來處理新任務,否則就會利用空閒的線程來處理新任務。線程池中的空閒線程都有超時機制,這個超時時長爲60秒,超過60秒閒置線程就會被回收。和FixedThreadPool不同的是,CachedThreadPool的任務隊列其實相當於一個空集合,這將導致任何任務都會立即被執行,因爲在這種場景下SynchronousQueue是無法插入任務的。從CachedThreadPool的特性來看,這類線程池比較適合 執行大量的耗時較少的任務 。當整個線程池都處於閒置狀態時,線程池中的線程都會超時而被停止,這個時候CachedThreadPool之中實際上是沒有任何線程的,它幾乎是不佔用任何系統資源的。
    在這裏插入圖片描述3. ScheduledThreadPool
    通過Executors的newScheduledThreadPool方法來創建。它的核心線程數量是固定的,而非核心線程數是沒有限制的,並且當非核心線程閒置時會被立即回收。ScheduledThreadPool這類線程池主要 用於執行定時任務和具有固定週期的重複任務
    在這裏插入圖片描述4. SingleThreadExecutor
    通過Executors的newSingleThreadExecutor方法來創建。這類線程池內部只有一個核心線程,它確保所有的任務都在同一個線程中按順序執行。SingleThreadExecutor的意義在於統一所有的外界任務到一個線程中,這使得在這些 任務之間不需要處理線程同步的問題 。newSingleThreadExecutor方法的實現如下所示。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章