創建線程池的方法
1、使用JDK1.5自帶的Executors框架創建線程池。
Executors框架提供了4種線程池的創建方法
- 創建一個固定數量的線程池
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}
特點:
1、線程池的核心線程數和最大線程數都是初始創建時傳入的線程數,
2、空閒線程結束的超時時間爲0
3、使用的LinkedBlockingQueue阻塞隊列,該阻塞隊列是鏈
表結構的無解隊列
- 創建單個線程的線程池
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
特點:
1、核心線程和最大線程都是1,
2、空閒線程結束的超時時間爲0
3、使用的也是LinkedBlockingQueue阻塞隊列
- 創建緩存線程池
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
}
特點:
1、核心線程數爲0
2、線程池最大線程爲Integer.MAX_VALUE
3、空閒線程結束超時時間爲60s
4、使用的是SynchronousQueue阻塞隊列,該阻塞隊列不會存儲元素
- 創建定時線程池
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
該線程池的特點創建一個可定時執行任務的線程池
Executors框架分析
1、Executors框架提供的集中創建線程池的方法,底層實際上都是使用瞭如下構造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
參數介紹:
corePoolSize:核心線程的數量,線程池在創建之後會一直存在的線程數量
maximimPoolSize:線程池的最大線程數
keepAliveTime:空閒線程的超時時間(當一個線程處於空閒狀態時,空閒多久會被停止)
unit:空閒時間的時間單位
workQueue:阻塞隊列
handler:決絕策略(如果線程已經達到最大且阻塞隊列也已經滿了,線程池要執行的處理策略)
2、運行分析
- 如果當前線程池中的線程數量沒有達到corePoolSize,則有新的任務直接創建新的線程執行
- 如果當前線程數量超過了corePoolSize,但是隊列沒有滿,則直接將任務放入阻塞隊列
- 如果當前線程數量達到了核心線程數且阻塞隊列也滿了,但是沒有達到最大線程數量,則繼續創建新的線程執行任務
- 如果當前線程已經達到線程池最大線程數量,則執行拒絕策略
3、常用的阻塞隊列的介紹
- LinkedBlockingQueue:是一個基於鏈表的無界阻塞隊列,隊列大小爲Integer.MAX_VALUE
- ArrayBlockingQueue:數組結構的有界隊列
- PriorityBlockingQueue:有優先級的阻塞隊列
- SynchronousQueue:不會存儲元素的阻塞隊列
- DelayedWorkQueue:一個無界隊列,能按照一定的順序對隊列中的元素進行排序
4、拒絕策略
- Executors框架提供的創建線程池的方法,使用的默認的拒絕策略
private static final RejectedExecutionHandler defaultHandler =
new AbortPolicy();
AbortPolicy:如果創建線程池不傳拒絕策略,則默認使用該策略。
該策略表示當線程池隊列滿了且達到最大線程時,直接拒絕處理,拋出異常,讓調用者自行處理
DiscardPolicy:丟棄策略,線程池不做任何處理
DiscardOldestPolicy:丟棄舊的任務來執行新的任務
CallerRunsPolicy:既不拋棄新任務,也不拋棄舊任務,直接在當前的線程運行新的任務。當前線程一般都是主線程
如果需要自定義拒絕策略,可以實現RejectedExecutionHandler接口
5、創建線程的工廠
每當線程池需要創建一個線程時,都是通過線程工廠來創建的,如果沒有指定線程工廠,就回使用默認的defaultThreadFactor
通過看DefaultThreadFactory()類源碼,該類實現了ThreadFactory接口,所以,如果有需要定製線程工廠,實現ThreadFactory接口即可
6、阻塞隊列的方法