java 執行緒池總結
阿新 • • 發佈:2019-01-23
執行緒池
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 直接丟棄提交的任務
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 內部類,原始碼很簡單。