Java多線程:類ThreadPoolExecutor詳解

1 public ThreadPoolExecutor(int corePoolSize,
2                                       int maximumPoolSize,
3                                       long keepAliveTime,
4                                       TimeUnit unit,
5                                       BlockingQueue<Runnable> workQueue,
6                                       ThreadFactory threadFactory,
7                                       RejectedExecutionHandler handler)

1. 參數解釋
corePoolSize:        線程池維護線程的最少數量
maximumPoolSize:線程池維護線程的最大數量
keepAliveTime:      線程池維護線程所容許的空閒時間
unit:                   線程池維護線程所容許的空閒時間的單位
workQueue:          線程池所使用的緩衝隊列
handler:               線程池對拒絕任務的處理策略,默認值ThreadPoolExecutor.AbortPolicy()

unit可選的參數爲java.util.concurrent.TimeUnit中的幾個靜態屬性:NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。
workQueue經常使用的是:java.util.concurrent.ArrayBlockingQueue
handler有四個選擇:
ThreadPoolExecutor.AbortPolicy()            拋出java.util.concurrent.RejectedExecutionException異常
ThreadPoolExecutor.CallerRunsPolicy()       重試添加當前的任務,他會自動重複調用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy()    拋棄舊的任務
ThreadPoolExecutor.DiscardPolicy()          拋棄當前的任務

2. 方法調用
一個任務經過 execute(Runnable)方法被添加到線程池,任務就是一個Runnable類型的對象,任務的執行方法就是 Runnable類型對象的run()方法。

3. 處理機制
當一個任務經過execute(Runnable)方法欲添加到線程池時:
若是此時線程池中的數量小於corePoolSize,即便線程池中的線程都處於空閒狀態,也要建立新的線程來處理被添加的任務。
若是此時線程池中的數量等於corePoolSize,可是緩衝隊列 workQueue未滿,那麼任務被放入緩衝隊列。
若是此時線程池中的數量大於corePoolSize,緩衝隊列workQueue滿,而且線程池中的數量小於maximumPoolSize,建新的線程來處理被添加的任務。
若是此時線程池中的數量大於corePoolSize,緩衝隊列workQueue滿,而且線程池中的數量等於maximumPoolSize,那麼經過 handler所指定的策略來處理此任務。

處理任務的多時:
核心線程corePoolSize、任務隊列workQueue、最大線程maximumPoolSize,若是三者都滿了,使用handler處理被拒絕的任務。
處理任務的少時:
當線程池中的線程數量大於corePoolSize時,若是某線程空閒時間超過keepAliveTime,線程將被終止。這樣,線程池能夠動態的調整池中的線程數。

4. 建立線程池的一些方法:
01 public static ExecutorService newFixedThreadPool(int nThreads) {
02     return new ThreadPoolExecutor(nThreads,
03                                 nThreads,
04                                 0L,
05                                 TimeUnit.MILLISECONDS,
06                                 newLinkedBlockingQueue<Runnable>());    
07 }
08  
09 public static ExecutorService newCachedThreadPool() {
10     return new ThreadPoolExecutor(0,
11                                 Integer.MAX_VALUE,
12                                 60L,
13                                 TimeUnit.SECONDS,
14                                 newSynchronousQueue<Runnable>());    
15 }
16  
17 public static ExecutorService newSingleThreadExecutor() {
18     return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1,
19                                                                         1,
20                                                                         0L,
21                                                                         TimeUnit.MILLISECONDS,
22                                                                         newLinkedBlockingQueue<Runnable>()));
相關文章
相關標籤/搜索