Executors源码解读——创建ExecutorService线程池
Executors源碼解讀——創建ExecutorService線程池
- 〇、[源碼版本] jdk 1.8
- 一、線程池概述
- 二、線程池創建
- 三、Executors源碼解讀
- newFixedThreadPool()
- newWorkStealingPool()
- newSingleThreadExecutor()
- newCachedThreadPool()
- newSingleThreadScheduledExecutor()
〇、[源碼版本] jdk 1.8
一、線程池概述
1)線程的創建需要操作線程資源、棧空間等,大量且頻繁的創建與銷毀需要消耗大量時間。
2)使用線程池處理,就可以復用一組線程,把一小組任務交給線程池分發處理。
3)線程池內維護了若干數量的線程:
a.沒有任務時候,這些線程處于等待狀態
b.有新任務,就分配一個空閑的線程執行
c.若所有線程處于忙碌狀態,新任務要么放入隊列等待,要么增加一個新線程進行處理。
二、線程池創建
ExecutorService是接口,它常用的創建方式可以通過Executors的方法來創建。
三、Executors源碼解讀
為這些對象提供工廠和實用方法:在concurrent包中定義的Executor、ExecutorService、ScheduledExecutorService、ThreadFactory和Callable類。
提供的方法返回結果類型有:
a.常規配置的ExecutorService
b.常規配置的ScheduledExecutorService
c.禁止修改配置的封裝后的ExecutorService
(d.將新創建的線程設置為已知狀態的ThreadFactory)
(e.在其他類似封閉(closure-like)的形式以外的Callable)
本文主要討論前三種。
newFixedThreadPool()
public static ExecutorService newFixedThreadPool(int nThreads)Executors創建一個線程池,該線程池復用固定數量的線程,線程操作在共享的無界隊列。在任何時候,最多nThreads個線程將正在運行處理任務。
如果在所有線程都處于忙碌狀態時,提交了其他任務,它們將在隊列中等待,直到有線程可用。
如果任何線程因執行期間的失敗而終止,且在關閉之前,如果后續任務需要執行,一個新線程將取而代之。
池中的線程會一直存在,直到明確調用ExecutorService的shutdown方法。
a.參數:
nThreads 池中的線程數
b.返回:
ExecutorService 新創建的線程池
c.異常
throws IllegalArgumentException
如果nThreads個數小于等于0時
newWorkStealingPool()
public static ExecutorService newWorkStealingPool(int parallelism)創建一個線程池,它維持足夠的線程來支持給定的并行度級別parallelism,并且可能會使用多個隊列來減少爭用。
并行度級別對應于最大的活躍線程參與數量、或可用于參與任務處理的線程數。線程的實際數量可能動態增長和收縮。work-stealing線程池不保證提交任務的執行順序。
a.參數:
parallelism 目標并行度級別
b.返回:
ExecutorService 新創建的線程池
c.異常
throws IllegalArgumentException
如果nThreads個數小于等于0時
創建一個work-stealing線程池,使用所有Runtime中的availableProcessors(可用處理器)作為其目標并行度級別。
a.參數:無
b.返回:
ExecutorService 新創建的線程池
c.異常
throws IllegalArgumentException
如果nThreads個數小于等于0時
newSingleThreadExecutor()
public static ExecutorService newSingleThreadExecutor()創建一個使用單個工作線程在無界隊列中操作的Executor。
請注意,如果這個單個線程由于在關閉之前的執行過程中失敗而終止,如果后續任務需要執行,一個新線程將取而代之。
會保證任務按順序執行,并且不超過一個任務,在任何給定時間內處于活躍狀態。與其他等效的newFixedThreadPool(1)不同,返回的執行器保證不可重新配置以使用其他線程。
a.參數:無
b.返回:
ExecutorService 新創建的線程池
c.異常:無
newCachedThreadPool()
public static ExecutorService newCachedThreadPool()創建一個線程池,根據需要創建線程,但之前構建的線程可用時會復用它們。這些線程池通常會提高程序(execute執行許多短期異步任務的)的性能。
調用execute將復用先前構造的線程(如果可用)。如果沒有可用的現有線程,則會創建一個新的線程并將其添加到線程池中。
60 秒內未使用的線程將被終止并從緩存中移除。因此,保持空閑足夠長時間的線程池將不會消耗任何資源。
請注意,可以使用ThreadPoolExecutor構造函數創建具有相似屬性但不同細節(例如,超時參數)的池。
a.參數:無
b.返回:
ExecutorService 新創建的線程池
c.異常:無
newSingleThreadScheduledExecutor()
public static ScheduledExecutorService newSingleThreadScheduledExecutor()創建一個單線程執行器executor,它可以安排命令在給定的延遲后運行,或定期執行。
但是請注意,如果這個單一的線程在關閉之前的執行過程中由于失敗而終止,如果后續任務需要執行,一個新的線程將取而代之。
會保證任務按順序執行,并且不超過一項任務將在任何給定時間處于活躍狀態。與其他等效的newScheduledThreadPool(1)不同,返回的執行器保證不可重新配置以使用其他線程。
總結
以上是生活随笔為你收集整理的Executors源码解读——创建ExecutorService线程池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java in thread main_
- 下一篇: 精通ASP.NET MVC ——URL和