java.util.concurrent
類 Executors
java.lang.Object
繼承者 java.util.concurrent.Executors
此類是個(gè)工具類,它提供對Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 類的一些實(shí)用方法。
此類支持以下各種方法:
* 創(chuàng)建并返回設(shè)置有常用配置的ExecutorService的方法。
* 創(chuàng)建并返回設(shè)置有常用配置的ScheduledExecutorService 的方法。
* 創(chuàng)建并返回“包裝的”ExecutorService 方法,它使特定于實(shí)現(xiàn)的方法不可訪問,只讓ExecutorService接口的方法可用。
* 創(chuàng)建并返回 ThreadFactory 的方法,它可將新創(chuàng)建的線程設(shè)置為已知的狀態(tài)。
* 創(chuàng)建并返回非閉包形式的 Callable 的方法,這樣可將其用于需要 Callable 的執(zhí)行方法中。
主要方法:
public static ExecutorService newFixedThreadPool(int nThreads)
創(chuàng)建一個(gè)可重用固定線程數(shù)的線程池,以共享的無界隊(duì)列方式來運(yùn)行這些線程。
在任意點(diǎn),在大多數(shù) nThreads 線程會處于處理任務(wù)的活動狀態(tài)。如果在所有線程處于活動狀態(tài)時(shí)提交附加任務(wù),
則在有可用線程之前,附加任務(wù)將在隊(duì)列中等待。如果在關(guān)閉前的執(zhí)行期間由于失敗而導(dǎo)致任何線程終止,
那么一個(gè)新線程將代替它執(zhí)行后續(xù)的任務(wù)(如果需要)。在某個(gè)線程被顯式地關(guān)閉之前,池中的線程將一直存在。
參數(shù):
nThreads - 池中的線程數(shù)
返回:
新創(chuàng)建的線程池
拋出:
IllegalArgumentException - 如果 nThreads <= 0
注意:它的全是core線程。其源碼如下:
return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
public static ExecutorService newFixedThreadPool(int nThreads,ThreadFactory threadFactory)
創(chuàng)建一個(gè)可重用固定線程數(shù)的線程池,以共享的無界隊(duì)列方式來運(yùn)行這些線程,在需要時(shí)使用提供的 ThreadFactory 創(chuàng)建新線程。在任意點(diǎn),在大多數(shù) nThreads 線程會處于處理任務(wù)的活動狀態(tài)。如果在所有線程處于活動狀態(tài)時(shí)提交附加任務(wù),則在有可用線程之前,附加任務(wù)將在隊(duì)列中等待。如果在關(guān)閉前的執(zhí)行期間由于失敗而導(dǎo)致任何線程終止,那么一個(gè)新線程將代替它執(zhí)行后續(xù)的任務(wù)(如果需要)。在某個(gè)線程被顯式地關(guān)閉之前,池中的線程將一直存在。
參數(shù):
nThreads - 池中的線程數(shù)
threadFactory - 創(chuàng)建新線程時(shí)使用的工廠
返回:
新創(chuàng)建的線程池
拋出:
NullPointerException - 如果 threadFactory 為 null
IllegalArgumentException - 如果 nThreads <= 0
public static ExecutorService newSingleThreadExecutor()
創(chuàng)建一個(gè)使用單個(gè) worker 線程的 Executor,以無界隊(duì)列方式來運(yùn)行該線程。
(注意,如果因?yàn)樵陉P(guān)閉前的執(zhí)行期間出現(xiàn)失敗而終止了此單個(gè)線程,那么如果需要,一個(gè)新線程將代替它執(zhí)行后續(xù)的任務(wù))。
可保證順序地執(zhí)行各個(gè)任務(wù),并且在任意給定的時(shí)間不會有多個(gè)線程是活動的。
與其他等效的 newFixedThreadPool(1) 不同,可保證不能對ThreadPoolExecutor重新進(jìn)行配置來使用更多的線程。
返回:
新創(chuàng)建的單線程 Executor
注意1:newSingleThreadExecutor與newFixedThreadPool(1)不同之出在于:
newSingleThreadExecutor返回的ExcutorService在析構(gòu)函數(shù)finalize()會調(diào)用shutdown(),即如果我們沒有對它調(diào)用shutdown(),那么可以確保它在被回收時(shí)調(diào)用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)
創(chuàng)建一個(gè)使用單個(gè) worker 線程的 Executor,以無界隊(duì)列方式來運(yùn)行該線程,并在需要時(shí)使用提供的 ThreadFactory 創(chuàng)建新線程。與其他等效的 newFixedThreadPool(1, threadFactory) 不同,可保證不能對ThreadPoolExecutor重新進(jìn)行配置來使用更多的線程。
參數(shù):
threadFactory - 創(chuàng)建新線程時(shí)使用的工廠
返回:
新創(chuàng)建的單線程 Executor
拋出:
NullPointerException - 如果 threadFactory 為 null
注意:newSingleThreadExecutor返回的ExcutorService在析構(gòu)函數(shù)finalize()會調(diào)用shutdown(),即如果我們沒有對它調(diào)用shutdown(),那么可以確保它在被回收時(shí)調(diào)用shutdown()來終止線程。
public static ExecutorService newCachedThreadPool()
創(chuàng)建一個(gè)可根據(jù)需要創(chuàng)建新線程的線程池,但是在以前構(gòu)造的線程可用時(shí)將重用它們。對于執(zhí)行很多短期異步任務(wù)的程序而言,
這些線程池通常可提高程序性能。調(diào)用 execute 將重用以前構(gòu)造的線程(如果線程可用)。
如果現(xiàn)有線程沒有可用的,則創(chuàng)建一個(gè)新線程并添加到池中。終止并從緩存中移除那些已有 60 秒鐘未被使用的線程。
因此,長時(shí)間保持空閑的線程池不會使用任何資源。
注意,可以使用 ThreadPoolExecutor 構(gòu)造方法創(chuàng)建具有類似屬性但細(xì)節(jié)不同(例如超時(shí)參數(shù))的線程池。
返回:
新創(chuàng)建的線程池
注意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)
創(chuàng)建一個(gè)可根據(jù)需要創(chuàng)建新線程的線程池,但是在以前構(gòu)造的線程可用時(shí)將重用它們,并在需要時(shí)使用提供的 ThreadFactory 創(chuàng)建新線程。
參數(shù):
threadFactory - 創(chuàng)建新線程時(shí)使用的工廠
返回:
新創(chuàng)建的線程池
拋出:
NullPointerException - 如果 threadFactory 為 null
public static ScheduledExecutorService newSingleThreadScheduledExecutor()
創(chuàng)建一個(gè)單線程執(zhí)行程序,它可安排在給定延遲后運(yùn)行命令或者定期地執(zhí)行。
(注意,如果因?yàn)樵陉P(guān)閉前的執(zhí)行期間出現(xiàn)失敗而終止了此單個(gè)線程,那么如果需要,一個(gè)新線程會代替它執(zhí)行后續(xù)的任務(wù))。
可保證順序地執(zhí)行各個(gè)任務(wù),并且在任意給定的時(shí)間不會有多個(gè)線程是活動的。
與其他等效的 newScheduledThreadPool(1) 不同,可保證不能對ScheduledThreadPoolExecutor重新進(jìn)行配置來使用更多的線程。
返回:
新創(chuàng)建的安排執(zhí)行程序
注意1:newSingleThreadScheduledExecutor與newScheduledThreadPool(1)不同之出在于:
newSingleThreadScheduledExecutor在析構(gòu)函數(shù)finalize()會調(diào)用shutdown(),即如果我們沒有對它調(diào)用shutdown(),那么可以確保它在被回收時(shí)調(diào)用shutdown()來終止線程。
源碼如下:public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
return new DelegatedScheduledExecutorService
(new ScheduledThreadPoolExecutor(1));
}
注意2:這里的ScheduledThreadPoolExecutor是core線程固定,且只有core線程,它的隊(duì)列是無界的。
public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory)
創(chuàng)建一個(gè)單線程執(zhí)行程序,它可安排在給定延遲后運(yùn)行命令或者定期地執(zhí)行。
(注意,如果因?yàn)樵陉P(guān)閉前的執(zhí)行期間出現(xiàn)失敗而終止了此單個(gè)線程,那么如果需要,一個(gè)新線程會代替它執(zhí)行后續(xù)的任務(wù))。
可保證順序地執(zhí)行各個(gè)任務(wù),并且在任意給定的時(shí)間不會有多個(gè)線程是活動的。與其他等效的 newScheduledThreadPool(1, threadFactory) 不同,可保證不能對ScheduledThreadPoolExecutor重新進(jìn)行配置來使用更多的線程。
參數(shù):
threadFactory - 創(chuàng)建新線程時(shí)使用的工廠
返回:
新創(chuàng)建的安排執(zhí)行程序
拋出:
NullPointerException - 如果 threadFactory 為 null
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
創(chuàng)建一個(gè)線程池,它可安排在給定延遲后運(yùn)行命令或者定期地執(zhí)行。
參數(shù):
corePoolSize - 池中所保存的線程數(shù),即使線程是空閑的也包括在內(nèi)。
返回:
新創(chuàng)建的安排線程池
拋出:
NullPointerException - 如果 threadFactory 為 null
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
創(chuàng)建一個(gè)線程池,它可安排在給定延遲后運(yùn)行命令或者定期地執(zhí)行。
參數(shù):
corePoolSize - 池中所保存的線程數(shù),即使線程是空閑的也包括在內(nèi)
threadFactory - 執(zhí)行程序創(chuàng)建新線程時(shí)使用的工廠
返回:
新創(chuàng)建的安排線程池
拋出:
IllegalArgumentException - 如果 corePoolSize < 0
NullPointerException - 如果 threadFactory 為 null
public static ExecutorService unconfigurableExecutorService(ExecutorService executor)
返回一個(gè)將所有已定義的 ExecutorService 方法委托給指定執(zhí)行程序的對象,這樣就無法使用強(qiáng)制轉(zhuǎn)換來訪問其他的方法。
這提供了一種可安全地“凍結(jié)”配置并且不允許調(diào)整給定具體實(shí)現(xiàn)的方法。
參數(shù):
executor - 底層實(shí)現(xiàn)
返回:
一個(gè) ExecutorService 實(shí)例
拋出:
NullPointerException - 如果 executor 為 null
注意:它的目的是只暴露ExecutorService接口方法,使特定于實(shí)現(xiàn)的方法不可訪問。它是通過一個(gè)類來包裝executor來實(shí)現(xiàn)的,該類實(shí)現(xiàn)了ExecutorService接口。具體來說只是調(diào)用executor的相應(yīng)函數(shù)。具體可以查閱源碼。
public static ScheduledExecutorService unconfigurableScheduledExecutorService(ScheduledExecutorService executor)
返回一個(gè)將所有已定義的 ExecutorService 方法委托給指定執(zhí)行程序的對象,這樣就無法使用強(qiáng)制轉(zhuǎn)換來訪問其他的方法。。這提供了一種可安全地“凍結(jié)”配置并且不允許調(diào)整給定具體實(shí)現(xiàn)的方法。
參數(shù):
executor - 底層實(shí)現(xiàn)
返回:
一個(gè) ScheduledExecutorService 實(shí)例
拋出:
NullPointerException - 如果 executor 為 null
注意:其目的和unconfigurableExecutorService相似。
public static ThreadFactory defaultThreadFactory()
返回用于創(chuàng)建新線程的默認(rèn)線程工廠。此工廠創(chuàng)建同一 ThreadGroup 中 Executor 使用的所有新線程。
如果有 SecurityManager,則它使用 System.getSecurityManager() 組來調(diào)用此 defaultThreadFactory 方法,其他情況則使用線程組。
每個(gè)新線程都作為非守護(hù)程序而創(chuàng)建,并且具有設(shè)置為 Thread.NORM_PRIORITY 中較小者的優(yōu)先級以及線程組中允許的最大優(yōu)先級。
新線程具有可通過 pool-N-thread-M 的 Thread.getName() 來訪問的名稱,其中 N 是此工廠的序列號,M 是此工廠所創(chuàng)建線程的序列號。
返回:
線程工廠
public static ThreadFactory privilegedThreadFactory()
返回用于創(chuàng)建新線程的線程工廠,這些新線程與當(dāng)前線程具有相同的權(quán)限。此工廠創(chuàng)建具有與 defaultThreadFactory() 相同設(shè)置的線程,
新線程的 AccessControlContext 和 contextClassLoader 的其他設(shè)置與調(diào)用此 privilegedThreadFactory 方法的線程相同。可以在 AccessController.doPrivileged(java.security.PrivilegedAction) 操作中創(chuàng)建一個(gè)新 privilegedThreadFactory,設(shè)置當(dāng)前線程的訪問控制上下文,以便創(chuàng)建具有該操作中保持的所選權(quán)限的線程。
注意,雖然運(yùn)行在此類線程中的任務(wù)具有與當(dāng)前線程相同的訪問控制和類加載器,但是它們無需具有相同的 ThreadLocal
或 InheritableThreadLocal 值。如有必要,使用 ThreadPoolExecutor.beforeExecute(java.lang.Thread, java.lang.Runnable)
在 ThreadPoolExecutor 子類中運(yùn)行任何任務(wù)前,可以設(shè)置或重置線程局部變量的特定值。
另外,如果必須初始化 worker 線程,以具有與某些其他指定線程相同的 InheritableThreadLocal 設(shè)置,
則可以在線程等待和服務(wù)創(chuàng)建請求的環(huán)境中創(chuàng)建自定義的 ThreadFactory,而不是繼承其值。
返回:
線程工廠
拋出:
AccessControlException - 如果當(dāng)前訪問控制上下文沒有獲取和設(shè)置上下文類加載器的權(quán)限。
public static <T> Callable<T> callable(Runnable task,T result)
返回 Callable 對象,調(diào)用它時(shí)可運(yùn)行給定的任務(wù)并返回給定的結(jié)果。這在把需要 Callable 的方法應(yīng)用到其他無結(jié)果的操作時(shí)很有用。
參數(shù):
task - 要運(yùn)行的任務(wù)
result - 返回的結(jié)果
返回:
一個(gè) callable 對象
拋出:
NullPointerException - 如果 task 為 null
public static Callable<Object> callable(Runnable task)
返回 Callable 對象,調(diào)用它時(shí)可運(yùn)行給定的任務(wù)并返回 null。
參數(shù):
task - 要運(yùn)行的任務(wù)
返回:
一個(gè) callable 對象
拋出:
NullPointerException - 如果 task 為 null
public static Callable<Object> callable(PrivilegedAction<?> action)
返回 Callable 對象,調(diào)用它時(shí)可運(yùn)行給定特權(quán)的操作并返回其結(jié)果。
參數(shù):
action - 要運(yùn)行的特權(quán)操作
返回:
一個(gè) callable 對象
拋出:
NullPointerException - 如果 action 為 null
更多信息請查看IT技術(shù)專欄