Android線程池-學習總結

來源:互聯網
上載者:User

標籤:

線程池:

          一個線程池中會緩衝一定數量的線程,通過線程池就可以避免因為頻繁建立和銷毀線程所帶來的系統開銷。Android中的線程池來源於Java,主要是通過Executor來派生特定類型的線程池。

  優點:                                                                                                                                                                                                                                     1、重用的線程池中的線程,避免因為線程的建立和銷毀所帶來的效能開銷。                                                                                                2、避免大量的線程間因互相搶佔系統資源導致的阻塞現象;                                                                                                                             3、能夠對線程進行簡單的管理並提供定時執行,間隔執行等功能;

         Android中的線程池來源於Executor,Executor是一個介面,真正線程池實現為ThreadPoolExecutor,通過ThreadPoolExecutor提供的一系列參數來配置線程池,不同參數可以建立不同的線程池。其中Android中常見的四類具有不同功能的線程池為:FixThreadPool、CachedThreadPool、ScheduledThreadPooI、SingThreadExecutor。除了以上四種線程池外,我們可以根據情況自己設定參數自訂線程池。  

       首先我們先瞭解一下Android中ThreadPoolExecutor,它的構造方法提供了一系列參數來配置線程池。下面是一個比較常用的構造方法。


       corePoolSize:核心線程數,核心線程會一直存活,即使沒有任務需要處理。如果將ThreadPoolExecutor的allowCoreThreadTimeOut屬性設定為true,那麼閑置的核心線程在等待新任務到來時會有逾時策略,這個時間間隔由keepAliveTime所指定,當等待時間超過keepAliveTime所指定的時間長度後,核心線 程就會被終止。

      maximumPoolSize:線程池所能容納的最大線程數,當活動線程數達到這個數值後,後續的新任務將會被阻塞。

       keepAliveTime:當線程空閑時間達到keepAliveTime,該線程會退出,直到線程數量等於corePoolSize。如果allowCoreThreadTimeout設定為true,則所有線程均會退出直到線程數量為0。

       unit:用於指定keepAliveTime參數的時間單位,這是一個枚舉,常用的有
TimeUnit.MILLISECONDS、TimeUnit.SECOND、TimeUnit.MINUTES。

       workQueue:線程池中的任務隊列,通過線程池的execute方法提交的Runnable對象會儲存在這個參數中。

        threadFactory:線程工廠,為線程池提供建立新線程的功能。

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

四類常見線程池:

1、FixedThreadPool:通過Executors的newFixedThreadPool方法來建立。它是一種線程數量固定的線程池,當線程處於空閑狀態時,它們並不會被回收,除非線程池被關閉了。FixedThreadPool中只有核心線程並且這些核心線程沒有逾時機制,另外任務隊列也是沒有大小限制的。


程式中調用:


2、CachedThreadPool:它是一種線程數量不定的線程池,最大線程數可以任意大。這類線程池比較適合執行大量的耗時較少的任務。當整個線程池處於閑置狀態時,線程池中的線程都會逾時而被停止,這個時候CachedThreadPool之中實際是沒有任何線程的,它幾乎不佔用任何系統資源。


程式中調用:


3.ScheduledThreadPool:它的核心線程數量是固定的,而非核心線程數量是沒有限制的,並且當非核心線程閑置時會被立即回收。這類線程池主要用於執行定時任務和具有固定周期的重複任務。


程式中調用:


4、SingleThreadExecutor:它的線程池內部只有一個核心線程,它確保所有的任務都在同一個線程中按順序執行。其意義在於統一所有的外界任務到一個線程中,使得在這些任務之間不需要處理線程同步的問題。


程式中調用:


自訂線程池:

代碼中的注釋已經詳細講解了線程池的實現方式,在此不再傲述。

Android線程池-學習總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.