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 中,大量工作和子工作可能會由少數實際執行緒裝載,但代價是某些使用限制。
「main」 ForkJoinTask
會在明確提交至 ForkJoinPool
時開始執行,或者,如果尚未參與 ForkJoin 計算,則會 ForkJoinPool#commonPool()
透過 #fork
、 #invoke
或 相關方法開始執行 。 一旦啟動,它通常會接著啟動其他子工作。 如這個類別的名稱所指出,許多使用 ForkJoinTask
的程式只會 #fork
採用 和 #join
或 等 #invokeAll(ForkJoinTask...) invokeAll
衍生專案。 不過,此類別也提供一些其他方法,可在進階使用方式中扮演著作用,以及允許支援新形式的分叉/聯結處理擴充機制。
ForkJoinTask
是 的 Future
輕量型形式。 的效率 ForkJoinTask
源自一組限制 (,這些限制只是部分靜態強制執行) 反映其主要用途,做為計算純函式或在純隔離物件上運作的計算工作。 主要協調機制是 #fork
,它會排列非同步執行,而且 #join
在計算工作的結果之前不會繼續進行。 在理想情況下,計算應該避免 synchronized
方法或區塊,而且除了聯結其他工作之外,也應該將其他封鎖同步處理降到最低,或使用公告為與分叉/聯結排程合作的階段器。 可細分的工作也應該不執行封鎖 I/O,而且最好存取與其他執行中工作完全無關的變數。 不允許擲回這類 IOExceptions
已檢查的例外狀況,以鬆散強制執行這些指導方針。 不過,計算仍可能會遇到未核取的例外狀況,而重新擲回給嘗試加入這些例外狀況的呼叫端。 這些例外狀況可能包含 RejectedExecutionException
來自內部資源耗盡的詞幹,例如無法配置內部工作佇列。 重新擲回的例外狀況的運作方式與一般例外狀況相同,但可能的話,包含堆疊追蹤 (,例如使用 ex.printStackTrace()
起始計算的執行緒和實際遇到例外狀況的執行緒) ,至少只顯示後者。
您可以定義和使用可能封鎖的 ForkJoinTasks,但這樣做需要三個進一步的考慮:如果有任何 < em > 其他 < /em > 工作應該相依于封鎖外部同步處理或 I/O 的工作,則 (1) 完成幾個工作。 例如,從未聯結 (的事件樣式非同步工作,這些子類別 CountedCompleter
化) 通常屬於此類別。 (2) 若要將資源影響降到最低,工作應該很小;最好只執行 (可能) 封鎖動作。 (3) 除非 ForkJoinPool.ManagedBlocker
使用 API,或已知可能封鎖的工作數目小於集 ForkJoinPool#getParallelism
區的層級,否則集區無法保證有足夠的執行緒可供確保進度或效能良好。
等候完成和擷取工作 #join
結果的主要方法是 ,但有數個變體:方法 Future#get
支援可中斷和/或計時等候完成,並使用 Future
慣例報告結果。 方法 #invoke
在語意上相當於 fork(); join()
,但一律會嘗試在目前的執行緒中開始執行。 這些方法的 「 < em > quiet < /em > 」 形式不會擷取結果或報告例外狀況。 當一組工作正在執行時,您可能需要延遲處理結果或例外狀況,直到完成為止。 方法 invokeAll
(可在多個版本中使用) 執行最常見的平行調用形式:分支一組工作並全部聯結。
在最常見的用法中,分叉聯結配對的作用就像呼叫 (分叉) ,並從平行遞迴函式傳回 (聯結) 。 就像其他類型的遞迴呼叫一樣,傳回 (聯結) 最先執行。 例如, a.fork(); b.fork(); b.join(); a.join();
比起在 之前 b
聯結 a
,可能更有效率。
工作的執行狀態可以在數個詳細層級查詢: #isDone
如果工作以任何方式完成, (包括工作取消而不執行) 的情況,則為 true; #isCompletedNormally
如果工作未取消或遇到例外 #isCancelled
狀況,則為 true;如果工作已取消, (在此情況下 #getException
傳回 CancellationException
) 則為 true; #isCompletedAbnormally
如果工作已取消或遇到例外狀況,則為 true。 在此情況下 #getException
,會傳回遇到的例外狀況或 CancellationException
。
ForkJoinTask 類別通常不會直接子類別化。 相反地,您會子類別其中一個支援特定樣式分叉/聯結處理的抽象類別,通常 RecursiveAction
適用于大部分不會傳回結果的計算、 RecursiveTask
針對執行的結果,以及 CountedCompleter
針對已完成動作觸發其他動作的計算。 一般而言,具象的 ForkJoinTask 子類別會宣告組成其參數的欄位、在建構函式中建立,然後定義 compute
方法,以某種方式使用這個基類所提供的控制項方法。
只有在完成相依性為無迴圈時,方法 #join
及其變體才適合使用;也就是說,平行計算可以描述為向無循環圖表表, (DAG) 。 否則,執行可能會遇到一種死結形式,因為工作會迴圈等候彼此。 不過,此架構支援其他方法和技術 (,例如使用 Phaser
、 #helpQuiesce
和 #complete
) ,以針對未靜態結構化為 DAG 的問題建構自訂子類別。 為了支援這類使用方式,ForkJoinTask 可能會以不可部分 < 完成的方式使用 > 標記 < /em 標記/em > , #setForkJoinTaskTag
short
或使用 #compareAndSetForkJoinTaskTag
來檢查 #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 檔。
此頁面的部分是根據 原始碼專案所建立和共用的工作進行修改,並根據中所述的詞彙使用。
建構函式
ForkJoinTask() |
要呼叫之子類別的建構函式。 |
ForkJoinTask(IntPtr, JniHandleOwnership) |
建立 JNI 物件的 Managed 標記法時使用的建構函式;由執行時間呼叫。 |
屬性
Class |
傳回這個 |
Exception |
傳回基底計算所擲回的例外狀況,如果已取消, |
ForkJoinTaskTag |
傳回此工作的標記。 |
Handle |
基礎 Android 實例的控制碼。 (繼承來源 Object) |
IsCancelled |
如果此工作在正常完成之前已取消,則傳 |
IsCompletedAbnormally |
|
IsCompletedNormally |
如果此工作未擲回例外狀況且未取消,則傳 |
IsDone |
如果此工作已完成,則傳 |
JniIdentityHashCode |
在 內 |
JniPeerMembers |
在 內 |
PeerReference |
在 內 |
Pool |
傳回裝載目前線程的集區,如果目前線程是在任何 ForkJoinPool 外部執行,則 |
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() |
開始執行這項工作、視需要等候完成,並傳回其結果,或擲回 (未核取) |
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) |
在 內 |