Share via


ForkJoinTask 類別

定義

在 內 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
繼承
ForkJoinTask
衍生
屬性
實作

備註

在 內 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 > , #setForkJoinTaskTagshort 或使用 #compareAndSetForkJoinTaskTag 來檢查 #getForkJoinTaskTag 。 ForkJoinTask 實作不會針對任何用途使用這些 protected 方法或標記,但可能用於建構特製化子類別。 例如,平行圖形周遊可以使用提供的 方法來避免重新流覽已經處理的節點/工作。 (標記的方法名稱部分很大量,以鼓勵定義反映其使用模式的方法。)

大部分的基礎支援方法都是 final ,以防止覆寫內建系結至基礎輕量型工作排程架構的實作。 建立分支/聯結處理新基本樣式的開發人員應該至少實 protected 作方法 #exec#setRawResult#getRawResult ,同時引進可在其子類別中實作的抽象計算方法,可能依賴這個類別所提供的其他 protected 方法。

ForkJoinTasks 應該執行相對少量的計算。 大型工作應該分成較小的子工作,通常是透過遞迴分解。 作為非常粗略的經驗法則,工作應該執行超過 100 且小於 10000 個基本計算步驟,並應避免無限迴圈。 如果工作太大,則平行處理原則無法改善輸送量。 如果太小,記憶體和內部工作維護額外負荷可能會造成處理負荷不足。

這個類別提供 adaptCallable 的方法,這些方法 Runnable 可能會在混合執行 ForkJoinTasks 與其他種類的工作時使用。 當所有工作都屬於此形式時,請考慮使用以 em > asyncMode < /em > 建構的 < 集區。

ForkJoinTasks 是 Serializable ,可讓它們用於遠端執行架構等擴充功能。 只有在執行之前或之後才將工作序列化,但不在執行期間是合理的。 在執行本身期間,不會依賴序列化。

已在 1.7 中新增。

java.util.concurrent.ForkJoinTask JAVA 檔。

此頁面的部分是根據 原始碼專案所建立和共用的工作進行修改,並根據中所述的詞彙使用。

建構函式

ForkJoinTask()

要呼叫之子類別的建構函式。

ForkJoinTask(IntPtr, JniHandleOwnership)

建立 JNI 物件的 Managed 標記法時使用的建構函式;由執行時間呼叫。

屬性

Class

傳回這個 Object 的執行時間類別。

(繼承來源 Object)
Exception

傳回基底計算所擲回的例外狀況,如果已取消, CancellationExceptionnull 傳回 ,如果沒有或方法尚未完成,則傳回 。

ForkJoinTaskTag

傳回此工作的標記。

Handle

基礎 Android 實例的控制碼。

(繼承來源 Object)
IsCancelled

如果此工作在正常完成之前已取消,則傳 true 回 。

IsCompletedAbnormally

true如果此工作擲回例外狀況或已取消,則傳回 。

IsCompletedNormally

如果此工作未擲回例外狀況且未取消,則傳 true 回 。

IsDone

如果此工作已完成,則傳 true 回 。

JniIdentityHashCode

在 內 ForkJoinPool 執行之工作的抽象基類。

(繼承來源 Object)
JniPeerMembers

在 內 ForkJoinPool 執行之工作的抽象基類。

PeerReference

在 內 ForkJoinPool 執行之工作的抽象基類。

(繼承來源 Object)
Pool

傳回裝載目前線程的集區,如果目前線程是在任何 ForkJoinPool 外部執行,則 null 傳回 。

QueuedTaskCount

傳回目前背景工作執行緒分叉但尚未執行的工作數目估計。

RawRawResult

傳回 Join() 的結果,即使此工作異常完成,或 null 這個工作不知道已完成也一樣。

SurplusQueuedTaskCount

傳回目前背景工作執行緒所持有的本機佇列工作數目,相較于其他背景工作執行緒可能會竊取這些工作,或如果此執行緒未在 ForkJoinPool 中運作,則傳回零。

ThresholdClass

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

ThresholdType

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

方法

Adapt(ICallable)

傳回新的 ForkJoinTask ,它會執行 call 指定 Callable 做為其動作的 方法,並在 時 #join 傳回其結果,並將遇到的任何已檢查例外狀況轉譯為 RuntimeException

Adapt(IRunnable)

傳回新的 ForkJoinTask ,它會執行 run 指定 Runnable 做為其動作的 方法,並在 時 #join 傳回 Null 結果。

Adapt(IRunnable, Object)

傳回新的 ForkJoinTask ,它會執行 run 指定 Runnable 做為其動作的 方法,並在 時 #join 傳回指定的結果。

Cancel(Boolean)

嘗試取消此工作的執行。

Clone()

建立並傳回這個 物件的複本。

(繼承來源 Object)
CompareAndSetForkJoinTaskTag(Int16, Int16)

以不可部分完成的方式設定此工作的標記值。

Complete(Object)

完成這項工作,如果尚未中止或取消,則會傳回指定值,做為後續叫用 join 和相關作業的結果。

CompleteExceptionally(Throwable)

異常地完成這項工作,如果尚未中止或取消,則會在 和相關作業時 join 擲回指定的例外狀況。

Dispose()

在 內 ForkJoinPool 執行之工作的抽象基類。

(繼承來源 Object)
Dispose(Boolean)

在 內 ForkJoinPool 執行之工作的抽象基類。

(繼承來源 Object)
Equals(Object)

指出其他物件是否「等於」這個物件。

(繼承來源 Object)
Exec()

立即執行此工作的基底動作,如果從此方法傳回時,保證此工作已完成,則會傳回 true。

Fork()

排列 以非同步方式在目前工作執行所在的集區中執行此工作,如果適用,則使用 ,如果不是 #inForkJoinPool ,則為 ForkJoinPool#commonPool()

Get()

視需要等候計算完成,然後擷取其結果。

Get(Int64, TimeUnit)

視需要等候最多指定時間讓計算完成,然後擷取其結果,如果有的話。

GetHashCode()

傳回此物件的雜湊碼值。

(繼承來源 Object)
HelpQuiesce()

可能會執行工作,直到裝載目前工作 ForkJoinPool#isQuiescent 的集區是靜止為止。

InForkJoinPool()

true如果目前線程是以 ForkJoinWorkerThread ForkJoinPool 計算執行,則傳回 。

Invoke()

開始執行這項工作、視需要等候完成,並傳回其結果,或擲回 (未核取) RuntimeExceptionError 或基礎計算未核取的) 。

InvokeAll(ForkJoinTask, ForkJoinTask)

分叉指定的工作,傳回每個工作的保留時間 isDone ,或遇到未核取) 例外狀況 (時傳回,在此情況下會重新擲回例外狀況。

InvokeAll(ForkJoinTask[])

分叉指定集合中的所有工作,並在遇到未核取) 例外狀況 (保留時 isDone 傳回,在此情況下會重新擲回例外狀況。

InvokeAll(ICollection)

分叉指定集合中的所有工作,並在遇到未核取) 例外狀況 (保留時 isDone 傳回,在此情況下會重新擲回例外狀況。

JavaFinalize()

當垃圾收集判斷物件不再參考物件時,垃圾收集行程會在物件上呼叫。

(繼承來源 Object)
Join()

傳回計算 #isDone 完成時的結果。

Notify()

喚醒正在等候此物件監視器的單一線程。

(繼承來源 Object)
NotifyAll()

喚醒正在等候此物件監視器的所有線程。

(繼承來源 Object)
PeekNextLocalTask()

如果立即可用,則會傳回目前線程排入佇列但尚未執行的工作,但不會取消排程或執行。

PollNextLocalTask()

如果目前的執行緒正在 ForkJoinPool 中運作,則取消排程並傳回未執行目前線程的下一個工作,但尚未執行。

PollTask()

如果目前的執行緒是在 ForkJoinPool 中運作,則取消排程並傳回,如果沒有執行,則目前線程排入佇列但尚未執行下一個工作,如果有的話,或如果沒有可用,則為其他執行緒分叉的工作。

QuietlyComplete()

正常完成這項工作,而不設定值。

QuietlyInvoke()

開始執行此工作,並視需要等候完成,而不傳回其結果或擲回例外狀況。

QuietlyJoin()

聯結此工作,而不傳回其結果或擲回例外狀況。

Reinitialize()

重設此工作的內部簿記狀態,允許後續 fork 的 。

SetForkJoinTaskTag(Int16)

以不可部分完成的方式設定此工作的標記值,並傳回舊值。

SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
SetRawResult(Object)

強制以結果傳回指定的值。

ToArray<T>()

在 內 ForkJoinPool 執行之工作的抽象基類。

(繼承來源 Object)
ToString()

傳回物件的字串表示。

(繼承來源 Object)
TryUnfork()

嘗試取消排程此工作以執行。

UnregisterFromRuntime()

在 內 ForkJoinPool 執行之工作的抽象基類。

(繼承來源 Object)
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()

在 內 ForkJoinPool 執行之工作的抽象基類。

(繼承來源 Object)
IJavaPeerable.DisposeUnlessReferenced()

在 內 ForkJoinPool 執行之工作的抽象基類。

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

在 內 ForkJoinPool 執行之工作的抽象基類。

(繼承來源 Object)
IJavaPeerable.JniManagedPeerState

在 內 ForkJoinPool 執行之工作的抽象基類。

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

在 內 ForkJoinPool 執行之工作的抽象基類。

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

在 內 ForkJoinPool 執行之工作的抽象基類。

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

在 內 ForkJoinPool 執行之工作的抽象基類。

(繼承來源 Object)

擴充方法

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

在 內 ForkJoinPool 執行之工作的抽象基類。

GetJniTypeName(IJavaPeerable)

在 內 ForkJoinPool 執行之工作的抽象基類。

GetAsync(IFuture)

在 內 ForkJoinPool 執行之工作的抽象基類。

GetAsync(IFuture, Int64, TimeUnit)

在 內 ForkJoinPool 執行之工作的抽象基類。

適用於