java 線程池管理類(lèi):Executors
來(lái)源:易賢網(wǎng) 閱讀:1223 次 日期:2015-04-10 14:52:45
溫馨提示:易賢網(wǎng)小編為您整理了“java 線程池管理類(lèi):Executors”,方便廣大網(wǎng)友查閱!

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)欄

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:java 線程池管理類(lèi):Executors
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢(xún)回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢(xún)?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類(lèi)型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢(xún) | 簡(jiǎn)要咨詢(xún)須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話(huà):0871-65099533/13759567129 獲取招聘考試信息及咨詢(xún)關(guān)注公眾號(hào):hfpxwx
咨詢(xún)QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)