1. 程式人生 > >java 執行緒池總結

java 執行緒池總結

執行緒池
1、分類
1)、固定執行緒池
ExecutorService executorService = Executors.newFixedThreadPool(10);

2)、一個執行緒池
ExecutorService executorService = Executors.newSingleThreadExecutor();

3)、根據需要建立執行緒的執行緒池,沒有核心執行緒池。每次
ExecutorService executorService = Executors.newCachedThreadPool();

這三個都是用 ThreadPoolExecutor   實現的。建立ThreadPoolExecutor 主要引數有:
int corePoolSize核心執行緒池大小,這個執行緒是一直存活的,不會銷燬
int maximumPoolSize最大執行緒池大小,如果核心執行緒用完了,再有任務時會建立一個執行緒,所有的執行緒總數不能大於這個數。
long keepAliveTime      大於核心執行緒數執行緒,空閒的存活時間
TimeUnit unit           keepAliveTime 時間單位
BlockingQueue<Runnable> workQueue   存放執行緒的佇列,當沒有多餘的執行緒來執行執行緒時存放執行緒
ThreadFactory threadFactory執行緒工廠,用來建立工作執行緒
RejectedExecutionHandler handler    拒絕策略,當執行緒佇列存放滿時再提交任務執行緒時處理方法。
具體實現,看原始碼。主要關注 corePoolSize,maximumPoolSize,BlockingQueue 引數就可以了。

4)、CachedThreadPool是一個會根據需要建立新執行緒的執行緒池。
ExecutorService executor = Executors.newCachedThreadPool();

CachedThreadPool使用沒有容量的SynchronousQueue作為執行緒池的工作佇列,但CachedThreadPool的maximumPool是無界的。這意味著,如果主執行緒提交任務的速度高於maximumPool中執行緒處理任務的速度時,CachedThreadPool會不斷建立新執行緒。極端情況下,CachedThreadPool會因為建立過多執行緒而耗盡CPU和記憶體資源。

4)、排程執行緒池 ScheduledThreadPoolExecutor  是ThreadPoolExecutor 的子類

主要用來在給定的延遲之後執行任務,或者定期執行任務。ScheduledThreadPoolExecutor的功能與Timer類似,但ScheduledThreadPoolExecutor功能更強大、更靈活。Timer對應的是單個後臺執行緒,而ScheduledThreadPoolExecutor可以在建構函式中指定多個對應的後臺執行緒數。

定義:
class ScheduledThreadPoolExecutor 
        extends ThreadPoolExecutor
        implements ScheduledExecutorService

建立:
ScheduledThreadPoolExecutor ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);

使用的佇列是:DelayedWorkQueue,就是使用DelayQueue封裝了一個PriorityQueue,這個PriorityQueue會對佇列中的ScheduledFutureTask進行排序。排序時,time小的排在前面(時間早的任務將被先執行)。如果兩個ScheduledFutureTask的time相同,就比較sequenceNumber,sequenceNumber小的排在前面(也就是說,如果兩個任務的執行時間相同,那麼先提交的任務將被先執行)。

2、阻塞佇列
ArrayBlockingQueue陣列構成的有界阻塞佇列
LinkedBlockingQueue連結串列組成的有界阻塞佇列
PriorityBlockingQueue支援優先順序排序的無界阻塞佇列
DelayQueue使用優先順序佇列實現的無界阻塞佇列
SynchronousQueue不儲存元素的阻塞佇列
LinkedTransferQueue     連結串列組成的無界阻塞佇列
LinkedBlockingDeque連結串列組成的雙向阻塞佇列

3、拒絕策略
AbortPolicy直接丟擲異常,預設策略。
CallerRunsPolicy 使用呼叫都的執行緒來執行任務執行緒
DiscardOldestPolicy 丟棄佇列中最老的沒有執行的一個任務,然後執行executor 執行提交的任務
DiscardPolicy       直接丟棄提交的任務

這幾個拒絕策略都是 ThreadPoolExecutor  內部類,原始碼很簡單。