ForkJoinTask 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
在中 ForkJoinPool
執行之工作的抽象基類。
[Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "V" })]
public abstract class ForkJoinTask : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable, Java.Util.Concurrent.IFuture
[<Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "V" })>]
type ForkJoinTask = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface IFuture
- 繼承
- 衍生
- 屬性
- 實作
備註
在中 ForkJoinPool
執行之工作的抽象基類。 ForkJoinTask
是類似線程的實體,其重量比一般線程輕得多。 大量工作和子工作可能會由 ForkJoinPool 中的少量實際線程裝載,但有一些使用限制的價格。
「主要」ForkJoinTask
會在明確提交至 ForkJoinPool
時開始執行,或者,如果尚未參與 ForkJoin 計算,則會透過 #fork
、 #invoke
或相關方法開始ForkJoinPool#commonPool()
執行。 啟動之後,通常會接著啟動其他子工作。 如這個類別的名稱所指示,許多使用的程式只會採用 ForkJoinTask
和 #fork
或 #join
等 #invokeAll(ForkJoinTask...) invokeAll
衍生專案。 不過,這個類別也提供一些其他方法,這些方法可在進階使用方式中發揮作用,以及允許支援新形式的分支/聯結處理延伸機制。
ForkJoinTask
是的Future
輕量型形式。 ForkJoinTask
的效率源於一組限制(只有部分靜態可強制執行),以反映其主要用途來計算純函式,或在純隔離物件上操作。 主要協調機制是 #fork
,它會排列異步執行,而且 #join
在計算工作的結果之前,不會繼續進行。 在理想情況下,計算應該避免 synchronized
方法或區塊,而且應該將其他封鎖同步處理降到最低,除了聯結其他工作,或使用已公告為配合分叉/聯結排程的階段器等同步器。 可細分的工作也不應該執行封鎖 I/O,而且最好存取與其他執行中工作完全無關的變數。 不允許擲回等 IOExceptions
已檢查的例外狀況,以鬆散地強制執行這些指導方針。 不過,計算可能仍然遇到未核取的例外狀況,這些例外狀況會重新擲回給嘗試加入這些例外狀況的呼叫端。 這些例外狀況可能還包括 RejectedExecutionException
來自內部資源耗盡的幹系,例如無法配置內部工作佇列。 重新擲回的例外狀況的行為方式與一般例外狀況相同,但盡可能包含堆棧追蹤(例如使用 ex.printStackTrace()
所示)起始計算的線程,以及實際遇到例外狀況的線程;只有後者。
您可以定義及使用可能會封鎖的 ForkJoinTasks,但這樣做需要進一步考慮:(1) 如果任何其他</><em> 工作應該相依於封鎖外部同步處理或 I/O 的工作,則完成數項作業需要三個進一步考慮: (1) 完成數個。 從未加入的事件樣式異步工作(例如,這些子類別 CountedCompleter
化)通常屬於此類別。 (二)要盡量減少資源影響,任務應很小:最好只執行 (可能) 封鎖動作。 (3) 除非 ForkJoinPool.ManagedBlocker
使用 API,或已知可能封鎖的工作數目小於集 ForkJoinPool#getParallelism
區的層級,否則集區無法保證有足夠的線程可供使用,以確保進度或良好效能。
等候完成和擷取工作 #join
結果的主要方法是 ,但有數個變體: Future#get
方法支援可中斷和/或計時等候完成,並使用慣例報告結果 Future
。 方法 #invoke
在語意上相當於 fork(); join()
,但一律會嘗試在目前線程中開始執行。 這些方法的 「<em>quiet</em>」 形式不會擷取結果或報告例外狀況。 當執行一組工作時,這些可能很有用,而且您必須延遲處理結果或例外狀況,直到所有工作完成為止。 方法 invokeAll
(適用於多個版本)會執行最常見的平行調用形式:分叉一組工作,並將它們全部聯結。
在最典型的用法中,分叉聯結組的運作方式就像是來自平行遞歸函式的呼叫(分支)和傳回(join)。 如同其他類型的遞迴呼叫一樣,應該先執行傳回 (joins) 。 例如,a.fork(); b.fork(); b.join(); a.join();
比在 之前b
聯結a
的效率可能要高得多。
工作的執行狀態可以在數個詳細層級查詢:如果工作以任何方式完成,#isDone
則為 true;如果工作在未取消或遇到例外狀況的情況下完成,則為 true;如果工作取消或遇到例外狀況,則為 true;如果工作已取消,則為 true ;#getException
CancellationException
#isCompletedNormally
#isCompletedAbnormally
如果工作已取消或遇到例外#isCancelled
狀況,則為 true; 在這裡情況下#getException
,會傳回遇到的例外狀況或 CancellationException
。
ForkJoinTask 類別通常不是直接子類別。 相反地,您會將其中一個支援特定分支/聯結處理樣式的抽象類子類別子類別,通常是 RecursiveAction
針對不會傳回結果的大多數計算、 RecursiveTask
針對執行的結果,以及 CountedCompleter
那些已完成動作觸發其他動作的計算。 一般而言,具象 ForkJoinTask 子類別會宣告包含其參數的欄位、在建構函式中建立,然後定義 compute
方法,以某種方式使用這個基類所提供的控件方法。
只有在完成相依性不循環時,方法 #join
及其變體才適合使用;也就是說,平行計算可以描述為有向無循環圖表(DAG)。 否則,執行可能會發生一種死結,因為工作會迴圈等候彼此。 不過,此架構支援其他方法和技術(例如 Phaser
使用、 #helpQuiesce
和 #complete
),這些方法可用於建構自定義子類別的問題,而這些問題不是靜態結構化為 DAG。 若要支援這類用法,ForkJoinTask 可能會以不可部分完成的方式<標記>/em,並使用 來#compareAndSetForkJoinTaskTag
標記</em> 值short
#setForkJoinTaskTag
,並使用 進行檢查#getForkJoinTaskTag
。 ForkJoinTask 實作不會針對任何用途使用這些 protected
方法或標籤,但它們可能會在建構特製化子類別時使用。 例如,平行圖表周游可以使用所提供的方法來避免重新瀏覽已經處理的節點/工作。 (標記的方法名稱部分很龐大,以鼓勵定義反映其使用模式的方法。
大部分的基本支援方法是 final
,以防止覆寫內建系結至基礎輕量型工作排程架構的實作。 建立分支/聯結處理新基本樣式的開發人員應該最少實 protected
作方法 #exec
、 #setRawResult
和 #getRawResult
,同時引進可在子類別中實作的抽象計算方法,可能依賴這個類別所提供的其他 protected
方法。
ForkJoinTasks 應該執行相對少量的計算。 大型工作應該分割成較小的子工作,通常是透過遞歸分解。 作為一個非常粗略的經驗法則,工作應該執行超過100個且少於10000個基本計算步驟,並應避免無限迴圈。 如果工作太大,則平行處理原則無法改善輸送量。 如果太小,記憶體和內部工作維護額外負荷可能會造成處理負荷過大。
這個類別提供 adapt
和Callable
的方法Runnable
,可在混合執行 ForkJoinTasks
與其他種類的工作時使用。 當所有工作都是此窗體時,請考慮使用以 em>asyncMode</em> 建構的<集區。
ForkJoinTasks 是 Serializable
,可讓它們用於遠端執行架構等擴充功能。 最好只在或之後串行化工作,但不在執行期間。 串行化在執行本身期間並不依賴。
已在1.7中新增。
的 java.util.concurrent.ForkJoinTask
Java 檔。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。
建構函式
ForkJoinTask() |
要呼叫之子類別的建構函式。 |
ForkJoinTask(IntPtr, JniHandleOwnership) |
建立 JNI 物件的 Managed 表示法時使用的建構函式;由運行時間呼叫。 |
屬性
Class |
傳回這個 |
Exception |
傳回基底計算所擲回的例外狀況,如果 |
ForkJoinTaskTag |
傳回此工作的標記。 |
Handle |
基礎Android實例的句柄。 (繼承來源 Object) |
IsCancelled |
如果此工作在正常完成之前取消,則傳 |
IsCompletedAbnormally |
|
IsCompletedNormally |
|
IsDone |
如果這項工作已完成,則傳 |
JniIdentityHashCode |
在中 |
JniPeerMembers |
在中 |
PeerReference |
在中 |
Pool |
傳回裝載目前線程的集區,如果 |
QueuedTaskCount |
傳回目前背景工作線程尚未執行之任務數目的估計值。 |
RawRawResult |
傳回 由 傳回 Join()的結果,即使此工作異常完成,或 |
SurplusQueuedTaskCount |
傳回目前背景工作線程所持有的本機佇列工作數的估計值,而其他背景工作線程可能會竊取這些工作,如果此線程未在 ForkJoinPool 中運作,則為零。 |
ThresholdClass |
此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。 |
ThresholdType |
此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。 |
方法
Adapt(ICallable) |
傳回新的 ,這個新 |
Adapt(IRunnable) |
傳回執行 |
Adapt(IRunnable, Object) |
傳回新的 ,這個新 |
Cancel(Boolean) |
嘗試取消此工作的執行。 |
Clone() |
建立並傳回這個 對象的複本。 (繼承來源 Object) |
CompareAndSetForkJoinTaskTag(Int16, Int16) |
以不可部分完成的方式設定此工作的標籤。 |
Complete(Object) |
完成這項工作,如果尚未中止或取消,則傳回指定的值,因為後續 |
CompleteExceptionally(Throwable) |
異常地完成此工作,如果尚未中止或取消,會導致它擲回指定的例外狀況 |
Dispose() |
在中 |
Dispose(Boolean) |
在中 |
Equals(Object) |
指出其他物件是否「等於」這個物件。 (繼承來源 Object) |
Exec() |
立即執行此工作的基底動作,如果從此方法傳回時,保證此工作已完成,則會傳回 true。 |
Fork() |
會安排在集區中以異步方式執行此工作,如果適用,則執行目前工作;如果不適用 |
Get() |
視需要等候計算完成,然後擷取其結果。 |
Get(Int64, TimeUnit) |
視需要等候最多指定的時間讓計算完成,然後在可用時擷取其結果。 |
GetHashCode() |
傳回此物件的雜湊碼值。 (繼承來源 Object) |
HelpQuiesce() |
可能會執行工作,直到裝載目前工作 ForkJoinPool#isQuiescent 的集區是靜止為止。 |
InForkJoinPool() |
如果目前線程是以 |
Invoke() |
開始執行此工作、視需要等候完成,並傳回其結果,或擲回 (unchecked) |
InvokeAll(ForkJoinTask, ForkJoinTask) |
分叉指定的工作,在遇到每個工作或未核取的例外狀況保留時 |
InvokeAll(ForkJoinTask[]) |
會派生指定集合中的所有工作,並在遇到每個工作或未核取的例外狀況保留時 |
InvokeAll(ICollection) |
會派生指定集合中的所有工作,並在遇到每個工作或未核取的例外狀況保留時 |
JavaFinalize() |
當垃圾收集決定不再參考物件時,垃圾收集行程在 物件上呼叫。 (繼承來源 Object) |
Join() |
傳回計算 #isDone 完成時的結果。 |
Notify() |
喚醒正在等候此物件監視器的單一線程。 (繼承來源 Object) |
NotifyAll() |
喚醒正在等候此物件監視器的所有線程。 (繼承來源 Object) |
PeekNextLocalTask() |
如果立即可用,則會傳回目前線程排入佇列但尚未執行的工作,但不會取消排程或執行。 |
PollNextLocalTask() |
如果目前線程在 ForkJoinPool 中作業,則取消排程並傳回下一個由目前線程排入佇列但尚未執行的工作。 |
PollTask() |
如果目前線程是在 ForkJoinPool 中作業,則取消排程並傳回,但未執行,下一個工作會由目前線程排入佇列,但尚未執行,如果有的話,則為其他線程分叉的工作,如果有的話。 |
QuietlyComplete() |
一般不設定值即可完成這項工作。 |
QuietlyInvoke() |
開始執行此工作,並視需要等候完成,而不會傳回其結果或擲回例外狀況。 |
QuietlyJoin() |
聯結此工作,而不傳回其結果或擲回其例外狀況。 |
Reinitialize() |
重設此工作的內部記帳狀態,允許後續 |
SetForkJoinTaskTag(Int16) |
以不可部分完成的方式設定此工作的標記值,並傳回舊的值。 |
SetHandle(IntPtr, JniHandleOwnership) |
設定 Handle 屬性。 (繼承來源 Object) |
SetRawResult(Object) |
強制以結果傳回指定的值。 |
ToArray<T>() |
在中 |
ToString() |
傳回物件的字串表示。 (繼承來源 Object) |
TryUnfork() |
嘗試取消排程此工作以執行。 |
UnregisterFromRuntime() |
在中 |
Wait() |
讓目前線程等候直到喚醒為止,通常是藉由em <notified/em>或<em>interrupted</em> 來喚醒它。<> (繼承來源 Object) |
Wait(Int64) |
讓目前的線程等到喚醒為止,通常是因為 <em>notified</em> 或 <em>interrupted</em>,或直到經過一定數量的實時為止。 (繼承來源 Object) |
Wait(Int64, Int32) |
讓目前的線程等到喚醒為止,通常是因為 <em>notified</em> 或 <em>interrupted</em>,或直到經過一定數量的實時為止。 (繼承來源 Object) |
明確介面實作
IJavaPeerable.Disposed() |
在中 |
IJavaPeerable.DisposeUnlessReferenced() |
在中 |
IJavaPeerable.Finalized() |
在中 |
IJavaPeerable.JniManagedPeerState |
在中 |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
在中 |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
在中 |
IJavaPeerable.SetPeerReference(JniObjectReference) |
在中 |
擴充方法
JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
JavaCast<TResult>(IJavaObject) |
在中 |
GetJniTypeName(IJavaPeerable) |
在中 |
GetAsync(IFuture) |
在中 |
GetAsync(IFuture, Int64, TimeUnit) |
在中 |