程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> ThreadPoolExecutor-線程池開發的使用,android線程池的使用

ThreadPoolExecutor-線程池開發的使用,android線程池的使用

編輯:JAVA綜合教程

ThreadPoolExecutor-線程池開發的使用,android線程池的使用


好久沒有寫過筆記了,最近做的一個項目涉及打線程池和隊列的開發,覺得在這個項目中學習到的還是挺多的,對線程安全,並發的知識有加深認知;當然,現在用過的東西並不是代表以後還能娴熟的使用,做好筆記非常重要;

1:必須明白為什麼要使用線程池:(這點很重要)

  a:手上項目所需,因為項目主要的目的是實現多線程的數據推送;需要創建多線程的話,那就要處理好線程安全的問題;因為項目需要,還涉及到排隊下載的功能,所以就選擇了線程池來管理線程以及線程池裡面的任務隊列workQueue來實現項目所需的功能;

  b:在實際使用中,服務器在創建和銷毀線程上花費的時間和消耗的系統資源都相當大,甚至可能要比在處理實際的用戶請求的時間和資源要多的多。除了創建和銷毀線程的開銷之外,活動的線程也需要消耗系統資源。如果在一個jvm裡創建太多的線程,可能會使系統由於過度消耗內存或“切換過度”而導致系統資源不足。為了防止資源不足,服務器應用程序需要采取一些辦法來限制任何給定時刻處理的請求數目,盡可能減少創建和銷毀線程的次數,特別是一些資源耗費比較大的線程的創建和銷毀,盡量利用已有對象來進行服務,這就是“池化資源”技術產生的原因。 線程池主要用來解決線程生命周期開銷問題和資源不足問題(這段是摘自網絡)

2:如何創建一個線程池:

  

 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

 

 

 

這裡只是創建線程池其中的一個構造函數;其實其他的構造函數最終還是調用的這個構造函數;

說明一下這些參數的作用:

corePoolSize:核心池的大小,在創建了線程池後,線程池中的線程數為0,當有任務來之後,就會創建一個線程去執行任務,當線程池中的線程數目達到corePoolSize後,就會把到達的任務放到緩存隊列當中;

maximumPoolSize:線程池最大線程數,它表示在線程池中最多能創建多少個線程;這個參數是跟後面的阻塞隊列聯系緊密的;只有當阻塞隊列滿了,如果還有任務添加到線程池的話,會嘗試new 一個Thread的進行救急處理,立馬執行對應的runnable任務;如果繼續添加任務到線程池,且線程池中的線程數已經達到了maximumPoolSize,那麼線程就會就會執行reject操作(這裡後面會提及到)

keepAliveTime:表示線程沒有任務執行時最多保持多久時間會終止;默認情況下,只有當線程池中的線程數大於corePoolSize時,keepAliveTime才會起作用;即當線程池中的線程數大於corePoolSize時,如果一個線程空閒的時間達到keepAliveTime,則會終止,直到線程池中的線程數不超過corePoolSize。但是如果調用了allowCoreThreadTimeOut(boolean)方法並設置了參數為true,在線程池中的線程數不大於corePoolSize時,keepAliveTime參數也會起作用,直到線程池中的阻塞隊列大小為0;(這部分通過查看ThreadPoolExecutor的源碼分析--getTask()部分);

unit:參數keepAliveTime的時間單位,有7種取值,在TimeUnit類中有7種靜態屬性(時間單位)

workQueue:一個阻塞隊列,用來存儲等待執行的任務,這個參數的選擇也很重要,會對線程池的運行過程產生重大影響,一般來說,這裡的阻塞隊列有以下幾種選擇  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved