java.util.concurrent
類 Executors
java.lang.Object
繼承者 java.util.concurrent.Executors
此類是個工具類,它提供對Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 類的一些實用方法。
此類支持如下各類方法:
* 建立並返回設置有經常使用配置的ExecutorService的方法。
* 建立並返回設置有經常使用配置的ScheduledExecutorService 的方法。
* 建立並返回「包裝的」ExecutorService 方法,它使特定於實現的方法不可訪問,只讓ExecutorService接口的方法可用。
* 建立並返回 ThreadFactory 的方法,它可將新建立的線程設置爲已知的狀態。
* 建立並返回非閉包形式的 Callable 的方法,這樣可將其用於須要 Callable 的執行方法中。
主要方法:
public static ExecutorService newFixedThreadPool(int nThreads)
建立一個可重用固定線程數的線程池,以共享的無界隊列方式來運行這些線程。
在任意點,在大多數 nThreads 線程會處於處理任務的活動狀態。若是在全部線程處於活動狀態時提交附加任務,
則在有可用線程以前,附加任務將在隊列中等待。若是在關閉前的執行期間因爲失敗而致使任何線程終止,
那麼一個新線程將代替它執行後續的任務(若是須要)。在某個線程被顯式地關閉以前,池中的線程將一直存在。
參數:
nThreads - 池中的線程數
返回:
新建立的線程池
拋出:
IllegalArgumentException - 若是 nThreads <= 0
注意:它的全是core線程。其源碼以下:
return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
public static ExecutorService newFixedThreadPool(int nThreads,ThreadFactory threadFactory)
建立一個可重用固定線程數的線程池,以共享的無界隊列方式來運行這些線程,在須要時使用提供的 ThreadFactory 建立新線程。在任意點,在大多數 nThreads 線程會處於處理任務的活動狀態。若是在全部線程處於活動狀態時提交附加任務,則在有可用線程以前,附加任務將在隊列中等待。若是在關閉前的執行期間因爲失敗而致使任何線程終止,那麼一個新線程將代替它執行後續的任務(若是須要)。在某個線程被顯式地關閉以前,池中的線程將一直存在。
參數:
nThreads - 池中的線程數
threadFactory - 建立新線程時使用的工廠
返回:
新建立的線程池
拋出:
NullPointerException - 若是 threadFactory 爲 null
IllegalArgumentException - 若是 nThreads <= 0
public static ExecutorService newSingleThreadExecutor()
建立一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。
(注意,若是由於在關閉前的執行期間出現失敗而終止了此單個線程,那麼若是須要,一個新線程將代替它執行後續的任務)。
可保證順序地執行各個任務,而且在任意給定的時間不會有多個線程是活動的。
與其餘等效的 newFixedThreadPool(1) 不一樣,可保證不能對ThreadPoolExecutor從新進行配置來使用更多的線程。
返回:
新建立的單線程 Executor
注意1:newSingleThreadExecutor與newFixedThreadPool(1)不一樣之出在於:
newSingleThreadExecutor返回的ExcutorService在析構函數finalize()會調用shutdown(),即若是咱們沒有對它調用shutdown(),那麼能夠確保它在被回收時調用shutdown()來終止線程。
注意2:源碼以下:
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));
}
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory)
建立一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程,並在須要時使用提供的 ThreadFactory 建立新線程。與其餘等效的 newFixedThreadPool(1, threadFactory) 不一樣,可保證不能對ThreadPoolExecutor從新進行配置來使用更多的線程。
參數:
threadFactory - 建立新線程時使用的工廠
返回:
新建立的單線程 Executor
拋出:
NullPointerException - 若是 threadFactory 爲 nulljava
注意:newSingleThreadExecutor返回的ExcutorService在析構函數finalize()會調用shutdown(),即若是咱們沒有對它調用shutdown(),那麼能夠確保它在被回收時調用shutdown()來終止線程。緩存
public static ExecutorService newCachedThreadPool()
建立一個可根據須要建立新線程的線程池,可是在之前構造的線程可用時將重用它們。對於執行不少短時間異步任務的程序而言,
這些線程池一般可提升程序性能。調用 execute 將重用之前構造的線程(若是線程可用)。
若是現有線程沒有可用的,則建立一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。
所以,長時間保持空閒的線程池不會使用任何資源。
注意,可使用 ThreadPoolExecutor 構造方法建立具備相似屬性但細節不一樣(例如超時參數)的線程池。
返回:
新建立的線程池
注意1:它沒有core線程。源碼以下:
public static ExecutorService newCachedThreadPool() {安全
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
}
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory)
建立一個可根據須要建立新線程的線程池,可是在之前構造的線程可用時將重用它們,並在須要時使用提供的 ThreadFactory 建立新線程。
參數:
threadFactory - 建立新線程時使用的工廠
返回:
新建立的線程池
拋出:
NullPointerException - 若是 threadFactory 爲 null
public static ScheduledExecutorService newSingleThreadScheduledExecutor()
建立一個單線程執行程序,它可安排在給定延遲後運行命令或者按期地執行。
(注意,若是由於在關閉前的執行期間出現失敗而終止了此單個線程,那麼若是須要,一個新線程會代替它執行後續的任務)。
可保證順序地執行各個任務,而且在任意給定的時間不會有多個線程是活動的。
與其餘等效的 newScheduledThreadPool(1) 不一樣,可保證不能對ScheduledThreadPoolExecutor從新進行配置來使用更多的線程。
返回:
新建立的安排執行程序
注意1:newSingleThreadScheduledExecutor與newScheduledThreadPool(1)不一樣之出在於:
newSingleThreadScheduledExecutor在析構函數finalize()會調用shutdown(),即若是咱們沒有對它調用shutdown(),那麼能夠確保它在被回收時調用shutdown()來終止線程。
源碼以下:public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
return new DelegatedScheduledExecutorService
(new ScheduledThreadPoolExecutor(1));
}
注意2:這裏的ScheduledThreadPoolExecutor是core線程固定,且只有core線程,它的隊列是無界的。
public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory)
建立一個單線程執行程序,它可安排在給定延遲後運行命令或者按期地執行。
(注意,若是由於在關閉前的執行期間出現失敗而終止了此單個線程,那麼若是須要,一個新線程會代替它執行後續的任務)。
可保證順序地執行各個任務,而且在任意給定的時間不會有多個線程是活動的。與其餘等效的 newScheduledThreadPool(1, threadFactory) 不一樣,可保證不能對ScheduledThreadPoolExecutor從新進行配置來使用更多的線程。
參數:
threadFactory - 建立新線程時使用的工廠
返回:
新建立的安排執行程序
拋出:
NullPointerException - 若是 threadFactory 爲 null
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
建立一個線程池,它可安排在給定延遲後運行命令或者按期地執行。
參數:
corePoolSize - 池中所保存的線程數,即便線程是空閒的也包括在內。
返回:
新建立的安排線程池
拋出:
NullPointerException - 若是 threadFactory 爲 null
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
建立一個線程池,它可安排在給定延遲後運行命令或者按期地執行。
參數:
corePoolSize - 池中所保存的線程數,即便線程是空閒的也包括在內
threadFactory - 執行程序建立新線程時使用的工廠
返回:
新建立的安排線程池
拋出:
IllegalArgumentException - 若是 corePoolSize < 0
NullPointerException - 若是 threadFactory 爲 null
public static ExecutorService unconfigurableExecutorService(ExecutorService executor)
返回一個將全部已定義的 ExecutorService 方法委託給指定執行程序的對象,這樣就沒法使用強制轉換來訪問其餘的方法。
這提供了一種可安全地「凍結」配置而且不容許調整給定具體實現的方法。
參數:
executor - 底層實現
返回:
一個 ExecutorService 實例
拋出:
NullPointerException - 若是 executor 爲 null
注意:它的目的是隻暴露ExecutorService接口方法,使特定於實現的方法不可訪問。它是經過一個類來包裝executor來實現的,該類實現了ExecutorService接口。具體來講只是調用executor的相應函數。具體能夠查閱源碼。
public static ScheduledExecutorService unconfigurableScheduledExecutorService(ScheduledExecutorService executor)
返回一個將全部已定義的 ExecutorService 方法委託給指定執行程序的對象,這樣就沒法使用強制轉換來訪問其餘的方法。。這提供了一種可安全地「凍結」配置而且不容許調整給定具體實現的方法。
參數:
executor - 底層實現
返回:
一個 ScheduledExecutorService 實例
拋出:
NullPointerException - 若是 executor 爲 null
注意:其目的和unconfigurableExecutorService類似。
public static ThreadFactory defaultThreadFactory()
返回用於建立新線程的默認線程工廠。此工廠建立同一 ThreadGroup 中 Executor 使用的全部新線程。
若是有 SecurityManager,則它使用 System.getSecurityManager() 組來調用此 defaultThreadFactory 方法,其餘狀況則使用線程組。
每一個新線程都做爲非守護程序而建立,而且具備設置爲 Thread.NORM_PRIORITY 中較小者的優先級以及線程組中容許的最大優先級。
新線程具備可經過 pool-N-thread-M 的 Thread.getName() 來訪問的名稱,其中 N 是此工廠的序列號,M 是此工廠所建立線程的序列號。
返回:
線程工廠
public static ThreadFactory privilegedThreadFactory()
返回用於建立新線程的線程工廠,這些新線程與當前線程具備相同的權限。此工廠建立具備與 defaultThreadFactory() 相同設置的線程,
新線程的 AccessControlContext 和 contextClassLoader 的其餘設置與調用此 privilegedThreadFactory 方法的線程相同。能夠在 AccessController.doPrivileged(java.security.PrivilegedAction) 操做中建立一個新 privilegedThreadFactory,設置當前線程的訪問控制上下文,以便建立具備該操做中保持的所選權限的線程。
注意,雖然運行在此類線程中的任務具備與當前線程相同的訪問控制和類加載器,可是它們無需具備相同的 ThreadLocal
或 InheritableThreadLocal 值。若有必要,使用 ThreadPoolExecutor.beforeExecute(java.lang.Thread, java.lang.Runnable)
在 ThreadPoolExecutor 子類中運行任何任務前,能夠設置或重置線程局部變量的特定值。
另外,若是必須初始化 worker 線程,以具備與某些其餘指定線程相同的 InheritableThreadLocal 設置,
則能夠在線程等待和服務建立請求的環境中建立自定義的 ThreadFactory,而不是繼承其值。
返回:
線程工廠
拋出:
AccessControlException - 若是當前訪問控制上下文沒有獲取和設置上下文類加載器的權限。
public static <T> Callable<T> callable(Runnable task,T result)
返回 Callable 對象,調用它時可運行給定的任務並返回給定的結果。這在把須要 Callable 的方法應用到其餘無結果的操做時頗有用。
參數:
task - 要運行的任務
result - 返回的結果
返回:
一個 callable 對象
拋出:
NullPointerException - 若是 task 爲 null
public static Callable<Object> callable(Runnable task)
返回 Callable 對象,調用它時可運行給定的任務並返回 null。
參數:
task - 要運行的任務
返回:
一個 callable 對象
拋出:
NullPointerException - 若是 task 爲 null
public static Callable<Object> callable(PrivilegedAction<?> action)
返回 Callable 對象,調用它時可運行給定特權的操做並返回其結果。
參數:
action - 要運行的特權操做
返回:
一個 callable 對象
拋出:
NullPointerException - 若是 action 爲 null閉包