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