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

java.util.concurrent

類 Executors

java.lang.Object

繼承者 java.util.concurrent.Executors

此類是個工具類,它提供對Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 類的一些實用方法。

此類支持以下各種方法:

* 創(chuàng)建并返回設置有常用配置的ExecutorService的方法。

* 創(chuàng)建并返回設置有常用配置的ScheduledExecutorService 的方法。

* 創(chuàng)建并返回“包裝的”ExecutorService 方法,它使特定于實現(xiàn)的方法不可訪問,只讓ExecutorService接口的方法可用。

* 創(chuàng)建并返回 ThreadFactory 的方法,它可將新創(chuàng)建的線程設置為已知的狀態(tài)。

* 創(chuàng)建并返回非閉包形式的 Callable 的方法,這樣可將其用于需要 Callable 的執(zhí)行方法中。

主要方法:

public static ExecutorService newFixedThreadPool(int nThreads)

創(chuàng)建一個可重用固定線程數(shù)的線程池,以共享的無界隊列方式來運行這些線程。

在任意點,在大多數(shù) nThreads 線程會處于處理任務的活動狀態(tài)。如果在所有線程處于活動狀態(tài)時提交附加任務,

則在有可用線程之前,附加任務將在隊列中等待。如果在關閉前的執(zhí)行期間由于失敗而導致任何線程終止,

那么一個新線程將代替它執(zhí)行后續(xù)的任務(如果需要)。在某個線程被顯式地關閉之前,池中的線程將一直存在。

參數(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)建一個可重用固定線程數(shù)的線程池,以共享的無界隊列方式來運行這些線程,在需要時使用提供的 ThreadFactory 創(chuàng)建新線程。在任意點,在大多數(shù) nThreads 線程會處于處理任務的活動狀態(tài)。如果在所有線程處于活動狀態(tài)時提交附加任務,則在有可用線程之前,附加任務將在隊列中等待。如果在關閉前的執(zhí)行期間由于失敗而導致任何線程終止,那么一個新線程將代替它執(zhí)行后續(xù)的任務(如果需要)。在某個線程被顯式地關閉之前,池中的線程將一直存在。

參數(shù):

nThreads - 池中的線程數(shù)

threadFactory - 創(chuàng)建新線程時使用的工廠

返回:

新創(chuàng)建的線程池

拋出:

NullPointerException - 如果 threadFactory 為 null

IllegalArgumentException - 如果 nThreads <= 0

public static ExecutorService newSingleThreadExecutor()

創(chuàng)建一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。

(注意,如果因為在關閉前的執(zhí)行期間出現(xiàn)失敗而終止了此單個線程,那么如果需要,一個新線程將代替它執(zhí)行后續(xù)的任務)。

可保證順序地執(zhí)行各個任務,并且在任意給定的時間不會有多個線程是活動的。

與其他等效的 newFixedThreadPool(1) 不同,可保證不能對ThreadPoolExecutor重新進行配置來使用更多的線程。

返回:

新創(chuàng)建的單線程 Executor

注意1:newSingleThreadExecutor與newFixedThreadPool(1)不同之出在于:

newSingleThreadExecutor返回的ExcutorService在析構函數(shù)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)

創(chuàng)建一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程,并在需要時使用提供的 ThreadFactory 創(chuàng)建新線程。與其他等效的 newFixedThreadPool(1, threadFactory) 不同,可保證不能對ThreadPoolExecutor重新進行配置來使用更多的線程。

參數(shù):

threadFactory - 創(chuàng)建新線程時使用的工廠

返回:

新創(chuàng)建的單線程 Executor

拋出:

NullPointerException - 如果 threadFactory 為 null

注意:newSingleThreadExecutor返回的ExcutorService在析構函數(shù)finalize()會調用shutdown(),即如果我們沒有對它調用shutdown(),那么可以確保它在被回收時調用shutdown()來終止線程。

public static ExecutorService newCachedThreadPool()

創(chuàng)建一個可根據(jù)需要創(chuàng)建新線程的線程池,但是在以前構造的線程可用時將重用它們。對于執(zhí)行很多短期異步任務的程序而言,

這些線程池通??商岣叱绦蛐阅?。調用 execute 將重用以前構造的線程(如果線程可用)。

如果現(xiàn)有線程沒有可用的,則創(chuàng)建一個新線程并添加到池中。終止并從緩存中移除那些已有 60 秒鐘未被使用的線程。

因此,長時間保持空閑的線程池不會使用任何資源。

注意,可以使用 ThreadPoolExecutor 構造方法創(chuàng)建具有類似屬性但細節(jié)不同(例如超時參數(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)建一個可根據(jù)需要創(chuàng)建新線程的線程池,但是在以前構造的線程可用時將重用它們,并在需要時使用提供的 ThreadFactory 創(chuàng)建新線程。

參數(shù):

threadFactory - 創(chuàng)建新線程時使用的工廠

返回:

新創(chuàng)建的線程池

拋出:

NullPointerException - 如果 threadFactory 為 null

public static ScheduledExecutorService newSingleThreadScheduledExecutor()

創(chuàng)建一個單線程執(zhí)行程序,它可安排在給定延遲后運行命令或者定期地執(zhí)行。

(注意,如果因為在關閉前的執(zhí)行期間出現(xiàn)失敗而終止了此單個線程,那么如果需要,一個新線程會代替它執(zhí)行后續(xù)的任務)。

可保證順序地執(zhí)行各個任務,并且在任意給定的時間不會有多個線程是活動的。

與其他等效的 newScheduledThreadPool(1) 不同,可保證不能對ScheduledThreadPoolExecutor重新進行配置來使用更多的線程。

返回:

新創(chuàng)建的安排執(zhí)行程序

注意1:newSingleThreadScheduledExecutor與newScheduledThreadPool(1)不同之出在于:

newSingleThreadScheduledExecutor在析構函數(shù)finalize()會調用shutdown(),即如果我們沒有對它調用shutdown(),那么可以確保它在被回收時調用shutdown()來終止線程。

源碼如下:public static ScheduledExecutorService newSingleThreadScheduledExecutor() {

return new DelegatedScheduledExecutorService

(new ScheduledThreadPoolExecutor(1));

}

注意2:這里的ScheduledThreadPoolExecutor是core線程固定,且只有core線程,它的隊列是無界的。

public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory)

創(chuàng)建一個單線程執(zhí)行程序,它可安排在給定延遲后運行命令或者定期地執(zhí)行。

(注意,如果因為在關閉前的執(zhí)行期間出現(xiàn)失敗而終止了此單個線程,那么如果需要,一個新線程會代替它執(zhí)行后續(xù)的任務)。

可保證順序地執(zhí)行各個任務,并且在任意給定的時間不會有多個線程是活動的。與其他等效的 newScheduledThreadPool(1, threadFactory) 不同,可保證不能對ScheduledThreadPoolExecutor重新進行配置來使用更多的線程。

參數(shù):

threadFactory - 創(chuàng)建新線程時使用的工廠

返回:

新創(chuàng)建的安排執(zhí)行程序

拋出:

NullPointerException - 如果 threadFactory 為 null

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

創(chuàng)建一個線程池,它可安排在給定延遲后運行命令或者定期地執(zhí)行。

參數(shù):

corePoolSize - 池中所保存的線程數(shù),即使線程是空閑的也包括在內。

返回:

新創(chuàng)建的安排線程池

拋出:

NullPointerException - 如果 threadFactory 為 null

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

創(chuàng)建一個線程池,它可安排在給定延遲后運行命令或者定期地執(zhí)行。

參數(shù):

corePoolSize - 池中所保存的線程數(shù),即使線程是空閑的也包括在內

threadFactory - 執(zhí)行程序創(chuàng)建新線程時使用的工廠

返回:

新創(chuàng)建的安排線程池

拋出:

IllegalArgumentException - 如果 corePoolSize < 0

NullPointerException - 如果 threadFactory 為 null

public static ExecutorService unconfigurableExecutorService(ExecutorService executor)

返回一個將所有已定義的 ExecutorService 方法委托給指定執(zhí)行程序的對象,這樣就無法使用強制轉換來訪問其他的方法。

這提供了一種可安全地“凍結”配置并且不允許調整給定具體實現(xiàn)的方法。

參數(shù):

executor - 底層實現(xiàn)

返回:

一個 ExecutorService 實例

拋出:

NullPointerException - 如果 executor 為 null

注意:它的目的是只暴露ExecutorService接口方法,使特定于實現(xiàn)的方法不可訪問。它是通過一個類來包裝executor來實現(xiàn)的,該類實現(xiàn)了ExecutorService接口。具體來說只是調用executor的相應函數(shù)。具體可以查閱源碼。

public static ScheduledExecutorService unconfigurableScheduledExecutorService(ScheduledExecutorService executor)

返回一個將所有已定義的 ExecutorService 方法委托給指定執(zhí)行程序的對象,這樣就無法使用強制轉換來訪問其他的方法。。這提供了一種可安全地“凍結”配置并且不允許調整給定具體實現(xiàn)的方法。

參數(shù):

executor - 底層實現(xiàn)

返回:

一個 ScheduledExecutorService 實例

拋出:

NullPointerException - 如果 executor 為 null

注意:其目的和unconfigurableExecutorService相似。

public static ThreadFactory defaultThreadFactory()

返回用于創(chuàng)建新線程的默認線程工廠。此工廠創(chuàng)建同一 ThreadGroup 中 Executor 使用的所有新線程。

如果有 SecurityManager,則它使用 System.getSecurityManager() 組來調用此 defaultThreadFactory 方法,其他情況則使用線程組。

每個新線程都作為非守護程序而創(chuàng)建,并且具有設置為 Thread.NORM_PRIORITY 中較小者的優(yōu)先級以及線程組中允許的最大優(yōu)先級。

新線程具有可通過 pool-N-thread-M 的 Thread.getName() 來訪問的名稱,其中 N 是此工廠的序列號,M 是此工廠所創(chuàng)建線程的序列號。

返回:

線程工廠

public static ThreadFactory privilegedThreadFactory()

返回用于創(chuàng)建新線程的線程工廠,這些新線程與當前線程具有相同的權限。此工廠創(chuàng)建具有與 defaultThreadFactory() 相同設置的線程,

新線程的 AccessControlContext 和 contextClassLoader 的其他設置與調用此 privilegedThreadFactory 方法的線程相同。可以在 AccessController.doPrivileged(java.security.PrivilegedAction) 操作中創(chuàng)建一個新 privilegedThreadFactory,設置當前線程的訪問控制上下文,以便創(chuàng)建具有該操作中保持的所選權限的線程。

注意,雖然運行在此類線程中的任務具有與當前線程相同的訪問控制和類加載器,但是它們無需具有相同的 ThreadLocal

或 InheritableThreadLocal 值。如有必要,使用 ThreadPoolExecutor.beforeExecute(java.lang.Thread, java.lang.Runnable)

在 ThreadPoolExecutor 子類中運行任何任務前,可以設置或重置線程局部變量的特定值。

另外,如果必須初始化 worker 線程,以具有與某些其他指定線程相同的 InheritableThreadLocal 設置,

則可以在線程等待和服務創(chuàng)建請求的環(huán)境中創(chuàng)建自定義的 ThreadFactory,而不是繼承其值。

返回:

線程工廠

拋出:

AccessControlException - 如果當前訪問控制上下文沒有獲取和設置上下文類加載器的權限。

public static <T> Callable<T> callable(Runnable task,T result)

返回 Callable 對象,調用它時可運行給定的任務并返回給定的結果。這在把需要 Callable 的方法應用到其他無結果的操作時很有用。

參數(shù):

task - 要運行的任務

result - 返回的結果

返回:

一個 callable 對象

拋出:

NullPointerException - 如果 task 為 null

public static Callable<Object> callable(Runnable task)

返回 Callable 對象,調用它時可運行給定的任務并返回 null。

參數(shù):

task - 要運行的任務

返回:

一個 callable 對象

拋出:

NullPointerException - 如果 task 為 null

public static Callable<Object> callable(PrivilegedAction<?> action)

返回 Callable 對象,調用它時可運行給定特權的操作并返回其結果。

參數(shù):

action - 要運行的特權操作

返回:

一個 callable 對象

拋出:

NullPointerException - 如果 action 為 null

更多信息請查看IT技術專欄

更多信息請查看網(wǎng)絡編程
易賢網(wǎng)手機網(wǎng)站地址:java 線程池管理類:Executors

2025國考·省考課程試聽報名

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