java併發庫之Executors經常使用的建立ExecutorService的幾個方法說明

1、線程池的建立 數組

咱們能夠經過ThreadPoolExecutor來建立一個線程池。 緩存

new  ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds,runnableTaskQueue, handler);

建立一個線程池須要輸入幾個參數: spa

  • corePoolSize(線程池的基本大小):當提交一個任務到線程池時,線程池會建立一個線程來執行任務,即便其餘空閒的基本線程可以執行新任務也會建立線程,等到須要執行的任務數大於線程池基本大小時就再也不建立。若是調用了線程池的prestartAllCoreThreads方法,線程池會提早建立並啓動全部基本線程。
  • runnableTaskQueue(任務隊列):用於保存等待執行的任務的阻塞隊列。 能夠選擇如下幾個阻塞隊列。
    • ArrayBlockingQueue:是一個基於數組結構的有界阻塞隊列,此隊列按 FIFO(先進先出)原則對元素進行排序。
    • LinkedBlockingQueue:一個基於鏈表結構的阻塞隊列,此隊列按FIFO (先進先出) 排序元素,吞吐量一般要高於ArrayBlockingQueue。靜態工廠方法Executors.newFixedThreadPool()使用了這個隊列。
    • SynchronousQueue:一個不存儲元素的阻塞隊列。每一個插入操做必須等到另外一個線程調用移除操做,不然插入操做一直處於阻塞狀態,吞吐量一般要高於LinkedBlockingQueue,靜態工廠方法Executors.newCachedThreadPool使用了這個隊列。
    • PriorityBlockingQueue:一個具備優先級的無限阻塞隊列。
  • maximumPoolSize(線程池最大大小):線程池容許建立的最大線程數。若是隊列滿了,而且已建立的線程數小於最大線程數,則線程池會再建立新的線程執行任務。值得注意的是若是使用了無界的任務隊列這個參數就沒什麼效果。
  • ThreadFactory:用於設置建立線程的工廠,能夠經過線程工廠給每一個建立出來的線程設置更有意義的名字。
  • RejectedExecutionHandler(飽和策略):當隊列和線程池都滿了,說明線程池處於飽和狀態,那麼必須採起一種策略處理提交的新任務。這個策略默認狀況下是AbortPolicy,表示沒法處理新任務時拋出異常。如下是JDK1.5提供的四種策略。
    • AbortPolicy:直接拋出異常。
    • CallerRunsPolicy:只用調用者所在線程來運行任務。
    • DiscardOldestPolicy:丟棄隊列裏最近的一個任務,並執行當前任務。
    • DiscardPolicy:不處理,丟棄掉。
    • 固然也能夠根據應用場景須要來實現RejectedExecutionHandler接口自定義策略。如記錄日誌或持久化不能處理的任務。
  • keepAliveTime(線程活動保持時間):線程池的工做線程空閒後,保持存活的時間。因此若是任務不少,而且每一個任務執行的時間比較短,能夠調大這個時間,提升線程的利用率。
  • TimeUnit(線程活動保持時間的單位):可選的單位有天(DAYS),小時(HOURS),分鐘(MINUTES),毫秒(MILLISECONDS),微秒(MICROSECONDS, 千分之一毫秒)和毫微秒(NANOSECONDS, 千分之一微秒)。

2、Executors提供了一些方便建立ThreadPoolExecutor的經常使用方法,主要有如下幾個: 線程

一、 Executors.newFixedThreadPool(int nThreads);建立固定大小(nThreads,大小不能超過int的最大值)的線程池 rest

//線程數量 日誌

 int nThreads = 20; code

//建立executor 服務  對象

 ExecutorService executor = Executors.newFixedThreadPool(nThreads) ; 排序

重載後的版本,須要多傳入實現了ThreadFactory接口的對象。 接口

 ExecutorService executor = Executors. newFixedThreadPool(nThreads,threadFactory);

說明:建立固定大小(nThreads,大小不能超過int的最大值)的線程池,緩衝任務的隊列爲LinkedBlockingQueue,大小爲整型的最大數,當使用此線程池時,在同執行的任務數量超過傳入的線程池大小值後,將會放入LinkedBlockingQueue,在LinkedBlockingQueue中的任務須要等待線程空閒後再執行,若是放入LinkedBlockingQueue中的任務超過整型的最大數時,拋出RejectedExecutionException。

二、Executors.newSingleThreadExecutor():建立大小爲1的固定線程池。

 ExecutorService executor = Executors.newSingleThreadExecutor();

重載後的版本,須要多傳入實現了ThreadFactory接口的對象。

 ExecutorService executor = Executors. newSingleThreadScheduledExecutor(ThreadFactory threadFactory) 

說明:建立大小爲1的固定線程池,同時執行任務(task)的只有一個,其它的(任務)task都放在LinkedBlockingQueue中排隊等待執行。

三、Executors.newCachedThreadPool();建立corePoolSize爲0,最大線程數爲整型的最大數,線程keepAliveTime爲1分鐘,緩存任務的隊列爲SynchronousQueue的線程池。

 ExecutorService executor = Executors.newCachedThreadPool();

固然也能夠如下面的方式建立,重載後的版本,須要多傳入實現了ThreadFactory接口的對象。

 ExecutorService executor = Executors.newCachedThreadPool(ThreadFactory threadFactory) ;

說明:使用時,放入線程池的task任務會複用線程或啓動新線程來執行,注意事項:啓動的線程數若是超過整型最大值後會拋出RejectedExecutionException異常,啓動後的線程存活時間爲一分鐘。

四、Executors.newScheduledThreadPool(int corePoolSize):建立corePoolSize大小的線程池。

//線程數量

 int corePoolSize= 20;

//建立executor 服務 

 ExecutorService executor = Executors.newScheduledThreadPool(corePoolSize) ;

重載後的版本,須要多傳入實現了ThreadFactory接口的對象。

 ExecutorService executor = Executors.newScheduledThreadPool(corePoolSize, threadFactory) ;

說明:線程keepAliveTime爲0,緩存任務的隊列爲DelayedWorkQueue,注意不要超過整型的最大值。

相關文章
相關標籤/搜索