語言

ThreadPoolExecutor 類別

定義

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

[Android.Runtime.Register("java/util/concurrent/ThreadPoolExecutor", DoNotGenerateAcw=true)]
public class ThreadPoolExecutor : Java.Util.Concurrent.AbstractExecutorService
[<Android.Runtime.Register("java/util/concurrent/ThreadPoolExecutor", DoNotGenerateAcw=true)>]
type ThreadPoolExecutor = class
    inherit AbstractExecutorService
繼承
衍生
屬性

備註

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

執行緒池解決了兩個不同的問題:它們通常在執行大量非同步任務時,因為每個任務調用的負擔較低,能提升效能;同時也提供一種綁定和管理執行任務集合時所消耗的資源(包括執行緒)的方法。 每個任務 ThreadPoolExecutor 還會維護一些基本統計數據,例如完成的任務數量。

為了在各種情境下都實用,這個類別提供了許多可調整參數和可擴充性鉤子。 然而,程式設計師被建議使用更方便 Executors 的工廠方法 Executors#newCachedThreadPool (無界執行緒池,具備自動執行緒回收)、 Executors#newFixedThreadPool (固定大小執行緒池)及 Executors#newSingleThreadExecutor (單一背景執行緒),這些方法預先設定了最常見的使用情境。 否則,手動設定和調整此類別時,請參考以下指南:

<DL>

<dt>核心與最大池大小</dt>

<dd>A ThreadPoolExecutor 會自動根據 corePoolSize(見#getPoolSize)和 maximumPoolSize(見#getCorePoolSize)設定的界限調整池大小(見#getMaximumPoolSize)。

當以方法 #execute(Runnable)提交新任務時,若執行執行緒少於 corePoolSize 執行緒,則會建立新執行緒來處理該請求,即使其他工作執行緒處於閒置狀態。 否則,如果執行的執行緒少於 maximumPoolSize 執行緒,則只有在隊列已滿時才會建立新執行緒來處理請求。 將 corePoolSize 與 maximumPoolSize 設定相同,即可建立固定大小的執行緒池。 透過將 maximumPoolSize 設定為幾乎無界的值,例如 Integer.MAX_VALUE,你就能讓池容納任意數量的同時進行任務。 通常,核心與最大池大小僅在建構時設定,但也可利用 #setCorePoolSize 和 #setMaximumPoolSize動態調整。 </dd>

<dt>按需建設</dt>

<dd>預設情況下,核心執行緒也會在新任務抵達時先建立並啟動,但此操作可透過方法 #prestartCoreThread 或 #prestartAllCoreThreads動態覆寫。 如果你建構的池子裡有非空佇列,你可能會想預先啟動執行緒。 </dd>

<dt>建立新執行緒</dt>

<dd>新執行緒是使用 ThreadFactory. 若未另行指定,則使用 a Executors#defaultThreadFactory ,該執行緒皆位於相同 ThreadGroup 且具有相同 NORM_PRIORITY 優先權且非守護程序狀態。 透過提供不同的 ThreadFactory,你可以更改執行緒的名稱、執行緒群組、優先權、守護進程狀態等。如果 ThreadFactory 在回傳 null newThread時無法建立執行緒,執行者會繼續執行,但可能無法執行任何任務。 執行緒應該擁有「modifyThread」 RuntimePermission這個功能。 若工作執行緒或其他使用池的其他執行緒未擁有此權限,服務可能會降級:組態變更可能無法及時生效,關機池也可能處於可終止但未完成的狀態。</dd>

<dt>保持生命時間</dt>

<dd>如果池目前有超過 corePoolSize 執行緒,過剩執行緒若閒置超過keepAliveTime,將會被終止(參見 #getKeepAliveTime(TimeUnit))。 這提供了一種在池子未被積極使用時減少資源消耗的方法。 如果池子後期變得更活躍,將會建立新的執行緒。 此參數也可利用方法 #setKeepAliveTime(long, TimeUnit)動態變更。 使用一個 Long.MAX_VALUETimeUnit#NANOSECONDS 值,實際上會讓閒置執行緒在關機前永遠無法終止。 預設情況下,keep-alive 政策僅在執行緒數超過 corePoolSize 時適用,但 #allowCoreThreadTimeOut(boolean) 只要 keepAliveTime 值非零,則可將此逾時策略套用於核心執行緒。 </dd>

<dt>排隊</dt>

<dd>任何 BlockingQueue 都可以用來轉移和保存已提交的任務。 使用此佇列與池大小互動:

<UL>

<如果>執行的執行緒少於 corePoolSize,執行者總是偏好新增執行緒而非排隊。

<li>如果有 corePoolSize 或更多執行緒在執行,執行者總是偏好排隊請求,而不是新增執行緒。

<如果>請求無法排隊,則會建立一個新執行緒,除非超過最大池大小(maximumPoolSize),否則該任務將被拒絕。

</ul>

排隊有三種一般策略: <ol>

<直接><>交接。</em> 一個不錯的預設工作佇列選擇是SynchronousQueue將任務交接給執行緒,且不會自行持有。 此時,若任務無法立即執行執行緒,排隊嘗試將失敗,因此會建構新執行緒。 此策略避免在處理可能有內部依賴的請求集合時發生鎖機。 直接交接通常需要無限最大池大小,以避免拒絕新提交的任務。 這也承認當指令平均到達速度超過處理速度時,執行緒可能無限成長。

<li><em> 無限佇列。</em> 使用無界隊列(例如沒有預設容量的 a LinkedBlockingQueue )會導致新任務在所有 corePoolSize 執行緒都忙碌時等待佇列。 因此,最多只會建立 corePoolSize 執行緒。 (因此 maximumPoolSize 的值不會產生影響。)當每個任務完全獨立於其他任務,任務無法影響彼此執行時,這可能適用;例如,在網頁伺服器中。 雖然這種排隊方式有助於平滑短暫的請求突發,但也承認當指令平均速度超過處理速度時,工作隊列可能無限成長。

<li><em>有界排隊。</em> 有界隊列(例如 an ArrayBlockingQueue)在有限 maximumPoolSizes 下可防止資源耗盡,但調整與控制可能較為困難。 佇列大小與最大池大小可能會相互取捨:使用大型佇列與較小池可減少 CPU 使用率、作業系統資源及上下文切換負擔,但可能導致人為降低吞吐量。 如果任務經常阻塞(例如I/O受限),系統可能會排程比你原本允許的更多執行緒的時間。 使用小型佇列通常需要較大的池大小,這會讓 CPU 保持更忙碌,但可能會遇到不可接受的排程開銷,進而降低吞吐量。

</ol>

</dd>

<dt>被拒絕的任務</dt>

<dd>在執行器關閉、執行器對最大執行緒與工作隊列容量使用有限界限且飽和時,方法中提交 #execute(Runnable) 的新任務會被 <em>拒絕</em> 。 無論哪種情況,該 execute 方法都會 RejectedExecutionHandler#rejectedExecution(Runnable, ThreadPoolExecutor) 調用其 RejectedExecutionHandler的方法。 提供四種預設的處理策略:

<進攻線>

<在>預設 ThreadPoolExecutor.AbortPolicy情況下,處理器在拒絕時拋出一個執行時間 RejectedExecutionException 。

<在>ThreadPoolExecutor.CallerRunsPolicy 中,呼叫自身的執行緒execute執行任務。 這提供了一個簡單的回饋控制機制,能減緩新任務提交的速度。

<在>ThreadPoolExecutor.DiscardPolicy ,無法執行的任務會直接被丟棄。 此政策僅針對極少數不依賴任務完成的情況設計。

<在>ThreadPoolExecutor.DiscardOldestPolicy 中,若執行器未關閉,工作佇列頂端的任務會被丟棄,然後執行會被重試(但執行可能會再次失敗,導致重複)。這種政策很少被接受。 幾乎所有情況下,你也應該取消任務,以在等待完成的元件中觸發異常,和/或記錄失敗,如文件所示 ThreadPoolExecutor.DiscardOldestPolicy 。

</ol>

也可以定義並使用其他類型的 RejectedExecutionHandler 類別。 此舉需要謹慎,尤其當政策設計僅在特定容量或排隊政策下運作時。 </dd>

<dt>鉤子方法</dt>

<dd>這個類別提供 protected 可 #beforeExecute(Thread, Runnable) 覆寫和 #afterExecute(Runnable, Throwable) 方法,這些方法會在每個任務執行前後被呼叫。 這些裝置可用來操控執行環境;例如,重新初始化 ThreadLocals、收集統計資料或新增日誌條目。 此外,該方法 #terminated 可被覆寫,以執行執行者完全終止後執行任何特殊處理。

若 hook、callback 或 BlockingQueue 方法拋出異常,內部工作執行緒可能會失敗、突然終止,甚至可能被替換。</dd>

<dt>排隊維修</dt>

<dd>方法 #getQueue() 允許存取工作佇列以進行監控與除錯。 強烈不建議將此方法用於其他用途。 提供兩種方法, #remove(Runnable)#purge 可用於協助大量待命任務取消時的儲存回收。</dd>

<dt>填海</dt>

<dd>一個已不再被<程式 em><> 且 em 已無剩餘執行緒的池,可以被回收(垃圾回收),而不會被明確關閉。 你可以設定一個池,讓所有未使用的執行緒最終都會死掉,方法是設定適當的保持存活時間、使用零核心執行緒的下限,和/或設定 #allowCoreThreadTimeOut(boolean)。 </dd>

</dl>

<b>擴充範例。</b> 此類別的大多數擴充覆蓋一個或多個受保護的掛鉤方法。 舉例來說,這裡有一個子職業加入了簡單的暫停/繼續功能:

{@code
            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();
                }
              }
            }}

已在1.5中新增。

的 java.util.concurrent.ThreadPoolExecutorJava 檔。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

建構函式

名稱 Description
ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue, IRejectedExecutionHandler)

建立 ThreadPoolExecutor 一個新的,包含給定的初始參數,以及 Executors#defaultThreadFactory 預設執行緒工廠。

ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue, IThreadFactory, IRejectedExecutionHandler)

建立 ThreadPoolExecutor 一個包含給定初始參數的新版本。

ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue, IThreadFactory)

建立 ThreadPoolExecutor 一個包含給定初始參數及 ThreadPoolExecutor 的新檔案。

ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue)

建立 ThreadPoolExecutor 一個包含初始參數的新版本,分別是 Executors#defaultThreadFactory 預設執行緒工廠與 ThreadPoolExecutor。

ThreadPoolExecutor(IntPtr, JniHandleOwnership)

用於建立 JNI 物件受管理表示的建構器;由執行時呼叫。

屬性

名稱 Description
ActiveCount

回傳正在執行任務的執行緒數量。

Class

回傳此 Object的執行時類別。

(繼承來源 Object)
CompletedTaskCount

回傳已完成執行任務的大致總數。

CorePoolSize

回傳核心執行緒數。 -或- 設定執行緒的核心數量。

Handle

基礎Android實例的句柄。

(繼承來源 Object)
IsShutdown
IsTerminated
IsTerminating

若該執行人正在終止或#shutdown#shutdownNow尚未完全終止,則會回傳真值。

JniIdentityHashCode

取得由互通執行時指派給此 Java 對等端的身份雜湊碼。

(繼承來源 Object)
JniManagedPeerState

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

(繼承來源 JavaObject)
JniPeerMembers

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

LargestPoolSize

回傳有史以來同時進入池中最多的執行緒。

MaximumPoolSize

回傳最大允許執行緒數。 -或- 設定最大允許執行緒數。

PeerReference

取得這個 Java 節點的 JNI 物件參考。

(繼承來源 Object)
PoolSize

回傳池中目前執行緒的數量。

Queue

回傳該執行者使用的任務佇列。

RejectedExecutionHandler

回傳目前無法執行任務的處理器。 -或- 為不可執行任務設定新的處理器。

TaskCount

回傳曾經排程執行過的任務總數。

ThreadFactory

回傳用於建立新執行緒的執行緒工廠。 -或- 設定用於建立新執行緒的執行緒工廠。

ThresholdClass

此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。

ThresholdType

此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。

方法

名稱 Description
AfterExecute(IRunnable, Throwable)

執行完成給定 Runnable 後會呼叫的方法。

AllowCoreThreadTimeOut(Boolean)

設定政策,規定若核心執行緒在保持有效時間內無任務抵達,是否可逾時終止,若有新任務抵達,則可重新啟用。

AllowsCoreThreadTimeOut()

若此池允許核心執行緒逾時,則在 keepAlive 時間內無任務抵達時終止,若有新任務到達,則會被替換。

AwaitTermination(Int64, TimeUnit)
AwaitTerminationAsync(Int64, TimeUnit)

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

(繼承來源 AbstractExecutorService)
BeforeExecute(Thread, IRunnable)

在執行給定執行緒中執行給定 Runnable 之前,呼叫的方法。

Clone()

建立並回傳此物件的副本。

(繼承來源 Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

(繼承來源 JavaObject)
Dispose()

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
Dispose(Boolean)

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
DisposeUnlessReferenced()

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

(繼承來源 JavaObject)
Equals(Object)

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

(繼承來源 JavaObject)
Equals(Object)

表示是否有其他物體「等同」於此物。

(繼承來源 Object)
Execute(IRunnable)

未來某個時候執行該任務。

GetHashCode()

回傳物件的雜湊碼值。

(繼承來源 Object)
GetKeepAliveTime(TimeUnit)

回傳執行緒保持存活時間,也就是執行緒在終止前可閒置的時間。

InvokeAll(ICollection, Int64, TimeUnit)

執行指定任務,並在所有任務完成或超時結束時(以先發生者為準)返回一份保存狀態與結果的未來清單。

(繼承來源 AbstractExecutorService)
InvokeAll(ICollection)

執行指定任務,完成後回傳一份包含狀態與結果的未來清單。

(繼承來源 AbstractExecutorService)
InvokeAny(ICollection, Int64, TimeUnit)

執行給定任務,若有任務在逾時期內完成,則回傳成功完成的任務結果(即未拋出例外)。

(繼承來源 AbstractExecutorService)
InvokeAny(ICollection)

執行給定任務,若有任務成功完成(即未拋出例外),則回傳結果。

(繼承來源 AbstractExecutorService)
JavaFinalize()
已淘汰.

當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。

(繼承來源 Object)
NewTaskFor(ICallable)

回傳給定可呼叫任務的 a RunnableFuture 。

(繼承來源 AbstractExecutorService)
NewTaskFor(IRunnable, Object)

回傳給定可執行且預設值的 a RunnableFuture 。

(繼承來源 AbstractExecutorService)
Notify()

喚醒一個正在該物件監視器上等待的執行緒。

(繼承來源 Object)
NotifyAll()

喚醒所有等待該物件監視器的執行緒。

(繼承來源 Object)
PrestartAllCoreThreads()

啟動所有核心執行緒,導致它們閒置等待工作。

PrestartCoreThread()

啟動核心執行緒,導致它閒置等待工作。

Purge()

嘗試從工作佇列中移除所有 Future 已取消的任務。

Remove(IRunnable)

如果該任務存在,會從執行者的內部佇列中移除,因此如果任務尚未啟動,則不會執行。

SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
SetKeepAliveTime(Int64, TimeUnit)

設定執行緒保持存活時間,也就是執行緒在終止前可閒置的時間。

SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

(繼承來源 JavaObject)
Shutdown()

啟動有序關機,執行先前提交的任務,但不再接受新的任務。

ShutdownNow()

嘗試停止所有正在執行的任務,停止等待任務的處理,並回傳等待執行的任務清單。

Submit(ICallable)

提交一個值回傳任務以供執行,並回傳一個代表該任務待處理結果的未來。

(繼承來源 AbstractExecutorService)
Submit(IRunnable, Object)

提交一個可執行的任務,並回傳代表該任務的 Future。

(繼承來源 AbstractExecutorService)
Submit(IRunnable)

提交一個可執行的任務,並回傳代表該任務的 Future。

(繼承來源 AbstractExecutorService)
Terminated()

當執行人終止時會被呼叫的方法。

ToArray<T>()

從這個 Java 陣列包裝器建立一個受管理陣列。

(繼承來源 Object)
ToString()

回傳物件的字串表示。

(繼承來源 Object)
UnregisterFromRuntime()

將此 Java 節點從互通執行時中取消註冊。

(繼承來源 Object)
Wait()

導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。

(繼承來源 Object)
Wait(Int64, Int32)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)
Wait(Int64)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)

明確介面實作

名稱 Description
IJavaPeerable.Disposed()

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

(繼承來源 JavaObject)
IJavaPeerable.Finalized()

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

(繼承來源 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

(繼承來源 JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

(繼承來源 JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

(繼承來源 JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

(繼承來源 JavaObject)
IJavaPeerable.UnregisterFromRuntime()

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

(繼承來源 AbstractExecutorService)

擴充方法

名稱 Description
AwaitTerminationAsync(IExecutorService, Int64, TimeUnit)

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

GetJniTypeName(IJavaPeerable)

取得實例 self類型的 JNI 名稱。

InvokeAnyAsync(IExecutorService, ICollection, Int64, TimeUnit)

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

InvokeAnyAsync(IExecutorService, ICollection)

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時間檢查的類型轉換。

JavaCast<TResult>(IJavaObject)

一個 ExecutorService 會用可能的多個池執行緒執行每個提交任務,通常透過 Executors 工廠方法配置。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於