|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
java.lang.Object java.util.concurrent.AbstractExecutorService java.util.concurrent.ThreadPoolExecutor
public class ThreadPoolExecutor
一個 ExecutorService
,它使用可能的幾個池執行緒之一執行每個提交的任務,通常使用 Executors
處理器方法配置。
執行緒池可以解決兩個不同問題:由於減少了每個任務調用的開銷,它們通常可以在執行大量非同步任務時提供增強的性能,並且還可以提供綁定和管理資源(包括執行任務集時使用的執行緒)的方法。每個 ThreadPoolExecutor 還維護著一些基本的統計資料,如完成的任務數。
為了便於跨大量上下文使用,此類別提供了很多可調整的參數和擴展鉤子 (hook)。但是,強烈建議開發人員使用較為方便的 Executors
處理器方法 Executors.newCachedThreadPool()
(無界執行緒池,可以進行自動執行緒回收)、Executors.newFixedThreadPool(int)
(固定大小執行緒池)和 Executors.newSingleThreadExecutor()
(單個後台執行緒),它們均為大多數使用場景預定義了設置。否則,在手動配置和調整此類別時,使用以下指導:
getCorePoolSize()
)和 maximumPoolSize(參見 getMaximumPoolSize()
)設置的邊界自動調整池大小。當新任務在方法 execute(java.lang.Runnable)
中提交時,如果運行的執行緒少於 corePoolSize,則創建新執行緒來處理請求,即使其他輔助執行緒是空閒的。如果運行的執行緒多於 corePoolSize 而少於 maximumPoolSize,則僅當佇列滿時才創建新執行緒。如果設置的 corePoolSize 和 maximumPoolSize 相同,則創建了固定大小的執行緒池。如果將 maximumPoolSize 設置為基本的無界值(如 Integer.MAX_VALUE),則允許池適應任意數量的共時任務。在大多數情況下,核心和最大池大小僅基於建構來設置,不過也可以使用 setCorePoolSize(int)
和 setMaximumPoolSize(int)
進行動態更改。 prestartCoreThread()
或 prestartAllCoreThreads()
對其進行動態覆寫。如果建構帶有非空(null)佇列的池,則可能希望預先啟動執行緒。 ThreadFactory
創建新執行緒。如果沒有另外說明,則在同一個 ThreadGroup
中一律使用 Executors.defaultThreadFactory()
創建執行緒,並且這些執行緒具有相同的 NORM_PRIORITY 優先級和非守護進程狀態。通過提供不同的 ThreadFactory,可以改變執行緒的名稱、執行緒組、優先級、守護進程狀態,等等。如果從 newThread 返回 null 時 ThreadFactory 未能創建執行緒,則執行程序將繼續運行,但不能執行任何任務。 getKeepAliveTime(java.util.concurrent.TimeUnit)
)。這提供了當池處於非活動狀態時減少資源消耗的方法。如果池後來變得更為活動,則可以創建新的執行緒。也可以使用方法 setKeepAliveTime(long, java.util.concurrent.TimeUnit)
動態地更改此參數。使用 Long.MAX_VALUE TimeUnit.NANOSECONDS
的值在關閉前有效地從以前的終止狀態禁用空閒執行緒。預設情況下,保持活動策略只在有多於 corePoolSizeThreads 的執行緒時應用。但是只要 keepAliveTime 值非 0,allowCoreThreadTimeOut(boolean)
方法也可將此逾時策略應用於核心執行緒。 BlockingQueue
都可用於傳輸和保持提交的任務。可以使用此佇列與池大小進行交互:
SynchronousQueue
,它將任務直接提交給執行緒而不保持它們。在此,如果不存在可用於立即運行任務的執行緒,則試圖把任務加入佇列將失敗,因此會建構一個新的執行緒。此策略可以避免在處理可能具有內部依賴性的請求集時出現鎖。直接提交通常要求無界 maximumPoolSizes 以避免拒絕新提交的任務。當命令以超過佇列所能處理的平均數連續到達時,此策略允許無界執行緒具有增長的可能性。LinkedBlockingQueue
)將導致在所有 corePoolSize 執行緒都忙時新任務在佇列中等待。這樣,創建的執行緒就不會超過 corePoolSize。(因此,maximumPoolSize 的值也就無效了。)當每個任務完全獨立於其他任務,即任務執行互不影響時,適合於使用無界佇列;例如,在 Web 頁伺服器中。這種排隊可用於處理瞬態突發請求,當命令以超過佇列所能處理的平均數連續到達時,此策略允許無界執行緒具有增長的可能性。ArrayBlockingQueue
)有助於防止資源耗盡,但是可能較難調整和控制。佇列大小和最大池大小可能需要相互折衷:使用大型佇列和小型池可以最大限度地降低 CPU 使用率、作業系統資源和上下文切換開銷,但是可能導致人工降低吞吐量。如果任務頻繁阻塞(例如,如果它們是 I/O 邊界),則系統可能為超過您許可的更多執行緒安排時間。使用小型佇列通常要求較大的池大小,CPU 使用率較高,但是可能遇到不可接受的排程開銷,這樣也會降低吞吐量。execute(java.lang.Runnable)
中提交的新任務將被拒絕。在以上兩種情況下,execute 方法都將調用其 RejectedExecutionHandler
的 RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor)
方法。下面提供了四種預定義的處理程序策略:
ThreadPoolExecutor.AbortPolicy
中,處理程序遭到拒絕將拋出運行時 RejectedExecutionException
。ThreadPoolExecutor.CallerRunsPolicy
中,執行緒調用運行該任務的 execute 本身。此策略提供簡單的反饋控制機制,能夠減緩新任務的提交速度。ThreadPoolExecutor.DiscardPolicy
中,不能執行的任務將被刪除。ThreadPoolExecutor.DiscardOldestPolicy
中,如果執行程序尚未關閉,則位於工作佇列頭部的任務將被刪除,然後重試執行程序(如果再次失敗,則重複此過程)。RejectedExecutionHandler
類別也是可能的,但這樣做需要非常小心,尤其是當策略僅用於特定容量或排隊策略時。beforeExecute(java.lang.Thread, java.lang.Runnable)
和 afterExecute(java.lang.Runnable, java.lang.Throwable)
方法,這兩種方法分別在執行每個任務之前和之後調用。它們可用於操縱執行環境;例如,重新初始化 ThreadLocal、搜集統計資訊或添加日誌條目。此外,還可以覆寫方法 terminated()
來執行 Executor 完全終止後需要完成的所有特殊處理。
如果鉤子 (hook) 或回調方法拋出異常,則內部輔助執行緒將依次失敗並突然終止。
getQueue()
允許出於監控和除錯目的而存取工作佇列。強烈反對出於其他任何目的而使用此方法。remove(java.lang.Runnable)
和 purge()
這兩種方法可用於在取消大量已排隊任務時說明進行存儲回收。shutdown()
),則必須安排未使用的執行緒最終終止:設置適當保持活動時間,使用 0 核心執行緒的下邊界和/或設置 allowCoreThreadTimeOut(boolean)
。擴展範例。此類別的大多數擴展可以覆寫一個或多個受保護的鉤子 (hook) 方法。例如,下面是一個添加了簡單的暫停/恢復功能的子類別:
class PausableThreadPoolExecutor extends ThreadPoolExecutor { private boolean isPaused; private ReentrantLock pauseLock = new ReentrantLock(); private Condition unpaused = pauseLock.newCondition(); public PausableThreadPoolExecutor(...) { super(...); } protected void beforeExecute(Thread t, Runnable r) { super.beforeExecute(t, r); pauseLock.lock(); try { while (isPaused) unpaused.await(); } catch(InterruptedException ie) { t.interrupt(); } finally { pauseLock.unlock(); } } public void pause() { pauseLock.lock(); try { isPaused = true; } finally { pauseLock.unlock(); } } public void resume() { pauseLock.lock(); try { isPaused = false; unpaused.signalAll(); } finally { pauseLock.unlock(); } } }
巢狀類別摘要 | |
---|---|
static class |
ThreadPoolExecutor.AbortPolicy
用於被拒絕任務的處理程序,它將拋出 RejectedExecutionException. |
static class |
ThreadPoolExecutor.CallerRunsPolicy
用於被拒絕任務的處理程序,它直接在 execute 方法的調用執行緒中運行被拒絕的任務;如果執行程序已關閉,則會丟棄該任務。 |
static class |
ThreadPoolExecutor.DiscardOldestPolicy
用於被拒絕任務的處理程序,它放棄最舊的未處理請求,然後重試 execute;如果執行程序已關閉,則會丟棄該任務。 |
static class |
ThreadPoolExecutor.DiscardPolicy
用於被拒絕任務的處理程序,預設情況下它將丟棄被拒絕的任務。 |
建構子摘要 | |
---|---|
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
用給定的初始參數和預設的執行緒處理器及被拒絕的執行處理程序創建新的 ThreadPoolExecutor。 |
|
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
用給定的初始參數和預設的執行緒處理器創建新的 ThreadPoolExecutor。 |
|
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
用給定的初始參數和預設被拒絕的執行處理程序創建新的 ThreadPoolExecutor。 |
|
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
用給定的初始參數創建新的 ThreadPoolExecutor。 |
方法摘要 | |
---|---|
protected void |
afterExecute(Runnable r,
Throwable t)
基於完成執行給定 Runnable 所調用的方法。 |
void |
allowCoreThreadTimeOut(boolean value)
如果在保持活動時間內沒有任務到達,新任務到達時正在替換(如果需要),則設置控制核心執行緒是逾時還是終止的策略。 |
boolean |
allowsCoreThreadTimeOut()
如果此池允許核心執行緒逾時和終止,如果在 keepAlive 時間內沒有任務到達,新任務到達時正在替換(如果需要),則返回 true。 |
boolean |
awaitTermination(long timeout,
TimeUnit unit)
請求關閉、發生逾時或者當前執行緒中斷,無論哪一個首先發生之後,都將導致阻塞,直到所有任務完成執行。 |
protected void |
beforeExecute(Thread t,
Runnable r)
在執行給定執行緒中的給定 Runnable 之前調用的方法。 |
void |
execute(Runnable command)
在將來某個時間執行給定任務。 |
protected void |
finalize()
當不再參考此執行程序時,調用 shutdown。 |
int |
getActiveCount()
返回主動執行任務的近似執行緒數。 |
long |
getCompletedTaskCount()
返回已完成執行的近似任務總數。 |
int |
getCorePoolSize()
返回核心執行緒數。 |
long |
getKeepAliveTime(TimeUnit unit)
返回執行緒保持活動的時間,該時間就是超過核心池大小的執行緒可以在終止前保持空閒的時間值。 |
int |
getLargestPoolSize()
返回曾經同時位於池中的最大執行緒數。 |
int |
getMaximumPoolSize()
返回允許的最大執行緒數。 |
int |
getPoolSize()
返回池中的當前執行緒數。 |
BlockingQueue<Runnable> |
getQueue()
返回此執行程序使用的任務佇列。 |
RejectedExecutionHandler |
getRejectedExecutionHandler()
返回用於未執行任務的當前處理程序。 |
long |
getTaskCount()
返回曾計劃執行的近似任務總數。 |
ThreadFactory |
getThreadFactory()
返回用於創建新執行緒的執行緒處理器。 |
boolean |
isShutdown()
如果此執行程序已關閉,則返回 true。 |
boolean |
isTerminated()
如果關閉後所有任務都已完成,則返回 true。 |
boolean |
isTerminating()
如果此執行程序處於在 shutdown 或 shutdownNow 之後正在終止但尚未完全終止的過程中,則返回 true。 |
int |
prestartAllCoreThreads()
啟動所有核心執行緒,使其處於等待工作的空閒狀態。 |
boolean |
prestartCoreThread()
啟動核心執行緒,使其處於等待工作的空閒狀態。 |
void |
purge()
嘗試從工作佇列移除所有已取消的 Future 任務。 |
boolean |
remove(Runnable task)
從執行程序的內部佇列中移除此任務(如果存在),從而如果尚未開始,則其不再運行。 |
void |
setCorePoolSize(int corePoolSize)
設置核心執行緒數。 |
void |
setKeepAliveTime(long time,
TimeUnit unit)
設置執行緒在終止前可以保持空閒的時間限制。 |
void |
setMaximumPoolSize(int maximumPoolSize)
設置允許的最大執行緒數。 |
void |
setRejectedExecutionHandler(RejectedExecutionHandler handler)
設置用於未執行任務的新處理程序。 |
void |
setThreadFactory(ThreadFactory threadFactory)
設置用於創建新執行緒的執行緒處理器。 |
void |
shutdown()
按過去執行已提交任務的順序發起一個有序的關閉,但是不接受新任務。 |
List<Runnable> |
shutdownNow()
嘗試停止所有的活動執行任務、暫停等待任務的處理,並返回等待執行的任務列表。 |
protected void |
terminated()
當 Executor 已經終止時調用的方法。 |
從類別 java.util.concurrent.AbstractExecutorService 繼承的方法 |
---|
invokeAll, invokeAll, invokeAny, invokeAny, newTaskFor, newTaskFor, submit, submit, submit |
從類別 java.lang.Object 繼承的方法 |
---|
clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
建構子詳細資訊 |
---|
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
Executors
處理器方法之一比使用此通用建構子方便得多。
corePoolSize
- 池中所保存的執行緒數,包括空閒執行緒。maximumPoolSize
- 池中允許的最大執行緒數。keepAliveTime
- 當執行緒數大於核心時,此為終止前多餘的空閒執行緒等待新任務的最長時間。unit
- keepAliveTime 參數的時間單位。workQueue
- 執行前用於保持任務的佇列。此佇列僅保持由 execute 方法提交的 Runnable 任務。
IllegalArgumentException
- 如果 corePoolSize 或 keepAliveTime 小於 0,或者 maximumPoolSize 小於等於 0,或者 corePoolSize 大於 maximumPoolSize。
NullPointerException
- 如果 workQueue 為 nullpublic ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
corePoolSize
- 池中所保存的執行緒數,包括空閒執行緒。maximumPoolSize
- 池中允許的最大執行緒數。keepAliveTime
- 當執行緒數大於核心時,此為終止前多餘的空閒執行緒等待新任務的最長時間。unit
- keepAliveTime 參數的時間單位。workQueue
- 執行前用於保持任務的佇列。此佇列僅保持由 execute 方法提交的 Runnable 任務。threadFactory
- 執行程序創建新執行緒時使用的處理器。
IllegalArgumentException
- 如果 corePoolSize 或 keepAliveTime 小於 0,或者 maximumPoolSize 小於等於 0,或者 corePoolSize 大於 maximumPoolSize。
NullPointerException
- 如果 workQueue 或 threadFactory 為 null。public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
corePoolSize
- 池中所保存的執行緒數,包括空閒執行緒。maximumPoolSize
- 池中允許的最大執行緒數。keepAliveTime
- 當執行緒數大於核心時,此為終止前多餘的空閒執行緒等待新任務的最長時間。unit
- keepAliveTime 參數的時間單位。workQueue
- 執行前用於保持任務的佇列。此佇列僅由保持 execute 方法提交的 Runnable 任務。handler
- 由於超出執行緒範圍和佇列容量而使執行被阻塞時所使用的處理程序。
IllegalArgumentException
- 如果 corePoolSize 或 keepAliveTime 小於 0,或者 maximumPoolSize 小於等於 0,或者 corePoolSize 大於 maximumPoolSize。
NullPointerException
- 如果 workQueue 或 handler 為 null。public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
corePoolSize
- 池中所保存的執行緒數,包括空閒執行緒。maximumPoolSize
- 池中允許的最大執行緒數。keepAliveTime
- 當執行緒數大於核心時,此為終止前多餘的空閒執行緒等待新任務的最長時間。unit
- keepAliveTime 參數的時間單位。workQueue
- 執行前用於保持任務的佇列。此佇列僅保持由 execute 方法提交的 Runnable 任務。threadFactory
- 執行程序創建新執行緒時使用的處理器。handler
- 由於超出執行緒範圍和佇列容量而使執行被阻塞時所使用的處理程序。
IllegalArgumentException
- 如果 corePoolSize 或 keepAliveTime 小於 0,或者 maximumPoolSize 小於等於 0,或者 corePoolSize 大於 maximumPoolSize。
NullPointerException
- 如果 workQueue、threadFactory 或 handler 為 null。方法詳細資訊 |
---|
public void execute(Runnable command)
command
- 要執行的任務。
RejectedExecutionException
- 如果無法接收要執行的任務,則由 RejectedExecutionHandler 決定是否拋出 RejectedExecutionException
NullPointerException
- 如果命令為 nullpublic void shutdown()
SecurityException
- 如果安全管理器存在並且關閉此 ExecutorService 可能操作某些不允許調用者修改的執行緒(因為它沒有 RuntimePermission
("modifyThread")),或者安全管理器的 checkAccess 方法拒絕存取。public List<Runnable> shutdownNow()
並不保證能夠停止正在處理的活動執行任務,但是會盡力嘗試。 此實作通過 Thread.interrupt()
取消任務,所以無法回應中斷的任何任務可能永遠無法終止。
SecurityException
- 如果安全管理器存在並且關閉此 ExecutorService 可能操作某些不允許調用者修改的執行緒(因為它沒有 RuntimePermission
("modifyThread")),或者安全管理器的 checkAccess 方法拒絕存取。public boolean isShutdown()
ExecutorService
複製的描述
public boolean isTerminating()
public boolean isTerminated()
ExecutorService
複製的描述
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
ExecutorService
複製的描述
timeout
- 最長等待時間unit
- timeout 參數的時間單位
InterruptedException
- 如果等待時發生中斷protected void finalize()
Object
中的 finalize
public void setThreadFactory(ThreadFactory threadFactory)
threadFactory
- 新執行緒處理器
NullPointerException
- 如果 threadFactory 為 nullgetThreadFactory()
public ThreadFactory getThreadFactory()
setThreadFactory(java.util.concurrent.ThreadFactory)
public void setRejectedExecutionHandler(RejectedExecutionHandler handler)
handler
- 新處理程序
NullPointerException
- 如果處理程序為 nullgetRejectedExecutionHandler()
public RejectedExecutionHandler getRejectedExecutionHandler()
setRejectedExecutionHandler(java.util.concurrent.RejectedExecutionHandler)
public void setCorePoolSize(int corePoolSize)
corePoolSize
- 新核心大小
IllegalArgumentException
- 如果 corePoolSize 小於 0getCorePoolSize()
public int getCorePoolSize()
setCorePoolSize(int)
public boolean prestartCoreThread()
public int prestartAllCoreThreads()
public boolean allowsCoreThreadTimeOut()
public void allowCoreThreadTimeOut(boolean value)
value
- 如果應該逾時,則為 true;否則為 false
IllegalArgumentException
- 如果 value 為 true 並且當前保持活動時間不大於 0。public void setMaximumPoolSize(int maximumPoolSize)
maximumPoolSize
- 新的最大值
IllegalArgumentException
- 如果新的最大值小於等於 0,或者小於核心池大小getMaximumPoolSize()
public int getMaximumPoolSize()
setMaximumPoolSize(int)
public void setKeepAliveTime(long time, TimeUnit unit)
time
- 等待的時間。時間值 0 將導致執行任務後多餘的執行緒立即終止。unit
- 時間參數的時間單位
IllegalArgumentException
- 如果時間小於 0,或者時間為 0 和 allowsCoreThreadTimeOutgetKeepAliveTime(java.util.concurrent.TimeUnit)
public long getKeepAliveTime(TimeUnit unit)
unit
- 所需的結果時間單位
setKeepAliveTime(long, java.util.concurrent.TimeUnit)
public BlockingQueue<Runnable> getQueue()
public boolean remove(Runnable task)
此方法可用作取消方案的一部分。它可能無法移除在放置到內部佇列之前已經轉換為其他形式的任務。例如,使用 submit 輸入的任務可能被轉換為維護 Future 狀態的形式。但是,在此情況下,purge()
方法可用於移除那些已被取消的 Future。
task
- 要移除的任務
public void purge()
Future
任務。此方法可用作存儲回收操作,它對功能沒有任何影響。取消的任務不會再次執行,但是它們可能在工作佇列中累積,直到 worker 執行緒主動將其移除。調用此方法將試圖立即移除它們。但是,如果出現其他執行緒的干預,那麼此方法移除任務將失敗。
public int getPoolSize()
public int getActiveCount()
public int getLargestPoolSize()
public long getTaskCount()
public long getCompletedTaskCount()
protected void beforeExecute(Thread t, Runnable r)
此實作不執行任何操作,但可在子類別中定制。註:為了正確巢狀多個覆寫操作,此方法結束時,子類別通常應該調用 super.beforeExecute。
t
- 將運行任務 r 的執行緒。r
- 將執行的任務。protected void afterExecute(Runnable r, Throwable t)
註:當操作顯示地或者通過 submit 之類別的方法包含在任務內時(如 FutureTask
),這些任務物件捕獲和維護計算異常,因此它們不會導致突然終止,內部異常不會 傳遞給此方法。
此實作不執行任何操作,但可在子類別中定制。註:為了正確巢狀多個覆寫操作,此方法開始時,子類別通常應該調用 super.afterExecute。
r
- 已經完成的 runnable 執行緒。t
- 導致終止的異常;如果執行正常結束,則為 null。protected void terminated()
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。