Java經過Executors提供四種線程池,分別爲:算法
ThreadPoolExecutor中定義瞭如下幾個重要屬性:緩存
corePoolSize:池中所保存的線程數,包括空閒線程。 maximumPoolSize:線程池中的最大線程數量。 keepAliveTime : 當線程數大於核心時,此爲終止前多餘的空閒線程等待新任務的最長時間,超過corePoolSize的空閒線程,在多長時間內會被銷燬。 TimeUnit unit:KeepAliveTime 參數的時間單位。 BlockingQueue<Runnable> workQueue:任務隊列,被提交的但還沒有被執行的任務。 workQueue主要有如下幾種實現類型 1). SynchronousQueue:直接提交的隊列,該隊列沒有容量,每個擦入操做都要對應一個相應的刪除操做,反之每一個刪除操做對應相應的插入操做。 SynchronousQueue不保存任務,它老是將任務提交給線程執行,若是沒有空閒的進程,則嘗試建立新的進程,若是進程已達到maximumPoolSize設置的最大線程數,則執行拒絕策略 2). ArrayBlockingQueue:有界任務隊列,ArrayBlockingQueue的構造函數必須帶一個容量參數(例如n),表示該隊列的最大容量。當有新任務執行時,這個定義當前線程數爲t,構造函數的容量參數爲n,當前隊列長度爲l 1.t<corePoolSize時,建立新的線程之心 2.t>corePoolSize且l<n時,插入到任務隊列,等待空閒線程執行 3.t>corePoolSize且l>=n時,建立新的線程執行新任務 4.t>maximumPoolSize時,執行拒絕策略。併發
3). LinkedBlockingQueue:無界任務隊列,當有新任務執行時,若是線程池中線程數小於corePoolSize則建立新的線程,不然進入隊列等待。若是沒有任務建立速度和處理速度差別很大,無界隊列會保持快速增加,直到耗盡系統內存 4). PriorityBlockingQueue: 優先級隊列,能夠控制任務的執行前後順序,是一個特殊的無界隊列。不管有界的隊列無界的隊列,都是按照先進先出算法處理任務(絮叨),而該隊列破例能夠根據任務自身的優先級順序前後執行。函數
JDK內置的拒絕策略以下: AbortPolity策略:該策略會直接拋出異常,阻止系統正常工做 CallerRunsPolity策略:只要線程爲關閉,該策略直接在調用者線程中,運行當前被丟棄的任務 DiscardOledstPolicy策略:該策略將丟棄最老的一個請求,也就是即將被執行的一個任務,並嘗試再次提交當前任務。 DiscardPlicy 策略:該策略默默的丟棄沒法處理的任務,不予任務處理。 若是以上策略不能知足實際應用需求,能夠擴展RejectedExecutionHandler 接口 public interface RejectedExecutionHandler { void rejectedExecution(Runnable r, ThreadPoolExecutor executor); } 其中,r爲請求執行的任務,executor爲當前線程池。線程