多線程學習筆記(3):線程池

1、線程池的概念

「池」,就是一個工廠,會提早生產出一些東西供使用。因此線程池就是處理多線程的一種方式。
其做用就在於:複用已有資源,控制資源總量多線程

2、爲何使用線程池

若是不使用線程池,那麼:
(1)使用單線程,可是這種方式吞吐量很是低,且請求量一大效率就會顯得很是低。
(2)那若是對於每一個請求都開一個線程去處理,這樣一旦請求量過大的時候,線程的建立和銷燬都要花費時間,而且線程自己也要佔用必定的內存。線程

使用線程池後,既能夠解決單線程低吞吐量和響應慢的問題,又解決了爲每個請求建立線程所耗費的資源問題。code

線程池經過限制線程的數量,可使線程數維持在一個合理的數量,充分發揮了CPU的做用。隊列

並且,線程池遵循了生產者消費者模式,將任務的建立和執行解耦內存

3、ThreadPoolExecutor

public class ThreadPoolExecutor extends AbstractExecutorService {
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler);
}

這裏是ThreadPoolExecutor最重要的一個構造方法
(1)corePoolSize : 線程池中維護線程的最少數量
當線程數少於corePoolSize時,就建立一條新的任務,無論是否有空閒的線程。資源

(2)maximumPoolSize: 線程池中維護線程的最大數量
當線程數到達corePoolSize,而且都不空閒,那麼新任務都放到任務隊列中去。當任務隊列放滿以後,若是線程數小於maximumPoolSize,就繼續建立新線程。同步

(3)keepAliveTime:線程池維護線程所容許的空閒時間
若是線程空閒的時間超過keepAliveTime,那麼就撤銷它。it

(4)unit: 線程池維護線程所容許的空閒時間的單位io

(5)workQueue: 線程池所使用的緩衝隊列
通常採用阻塞隊列,有不少種:
無界阻塞隊列、有界阻塞隊列、同步移交隊列class

(6)handler: 線程池對拒絕任務的處理策略
AbortPolicy:丟棄任務並拋出RejectedExecutionException異常。
DiscardPolicy:也是丟棄任務,可是不拋出異常。
DiscardOldestPolicy:丟棄隊列最前面的任務,而後從新嘗試執行任務(重複此過程)
CallerRunsPolicy:由調用線程處理該任務

4、四種線程池

一、CachedThreadPool
先查看有沒有可用的線程,沒有再建立新線程

二、FixedThreadPool
與上一種差很少,可是不容許隨時建立新線程
任意時間點,最多隻能有固定數目的活動線程存在,此時若是有新的線程要創建,只能放在另外的隊列中等待,直到當前的線程中某個線程終止直接被移出池子。

三、ScheduledThreadPool
這個池子裏的線程能夠按 schedule 依次 delay 執行,或週期執行

四、SingleThreadExecutor任意時間內池子裏只能有一個線程。

相關文章
相關標籤/搜索