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.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. A ForkJoinTask 是一種線狀實體,重量遠輕於一般線。 大量任務與子任務可能由少數實際執行緒在 ForkJoinPool 中承載,但代價是使用量有限。
「主」ForkJoinTask執行從明確提交給 ForkJoinPool,或若尚未進行 ForkJoin 計算,則透過 、 ForkJoinPool#commonPool()、 或相關方法開始#fork#invoke執行。 一旦開始,通常會接著啟動其他子任務。 如同這個類別名稱所示,許多使用程式 ForkJoinTask 只使用方法 #fork 和 #join,或是導數如 #invokeAll(ForkJoinTask...) invokeAll。 然而,本類別也提供了多種可用於進階應用的方法,以及允許支援新型分叉/連接處理形式的擴充機制。
A ForkJoinTask 是 的 Future輕量級形式。 S 的 ForkJoinTask效率來自一組限制(這些限制僅部分靜態可執行),反映其主要用於計算純函數或操作純孤立物件的計算任務。 主要的協調機制包括 #fork,安排非同步執行,以及 #join,直到任務結果被計算出來才會進行。 計算理想上應避免 synchronized 方法或區塊,並盡量減少其他阻塞同步,除了加入其他任務或使用宣稱能配合分叉/連接排程的同步器(如相位器)外。 可細分任務也不應執行阻塞I/O,理想狀況下應存取完全獨立於其他執行任務存取的變數。 這些指引執行較為寬鬆,不允許有檢查的例外,例如 IOExceptions 投擲。 然而,計算仍可能遇到未檢查的例外,這些例外會被重新拋給嘗試加入的呼叫者。 這些例外還可能包括 RejectedExecutionException 內部資源耗盡,例如未能分配內部任務佇列。 重拋異常的行為與一般例外相同,但若可能,包含發起計算的執行緒與實際遇到異常的執行緒的堆疊痕跡(例如使用 ex.printStackTrace()),至少僅包含後者。
可以定義並使用 ForkJoinTasks 來阻塞,但這需要另外三項考量:(1) 完成的 <em>< 其他或 em> 任務應依賴於阻擋外部同步或 I/O 的任務。 事件型非同步任務若從未被加入(例如子 CountedCompleter類別任務)通常屬於此類。 (2) 為了減少資源負擔,任務應縮小;理想狀況下,只執行(可能的)阻擋動作。 (3) 除非 ForkJoinPool.ManagedBlocker 使用 API,或已知可能被阻塞的任務數量少於池的 ForkJoinPool#getParallelism 層級,否則池無法保證有足夠的執行緒可用以確保進度或良好效能。
等待任務完成及擷取結果 #join的主要方法是 ,但也有幾種變體:這些 Future#get 方法支援可中斷和/或定時等待完成,並透過 Future 慣例回報結果。 方法 #invoke 在語意上等價 fork(); join() 於 ,但總是嘗試在當前執行緒中開始執行。 這些方法的「<em>quiet</em>」形式不會擷取結果或報告例外。 當一組任務正在執行時,需要延遲結果或例外的處理直到全部完成,這些工具可能很有用。 方法 invokeAll (有多個版本)執行最常見的平行調用形式:分叉一組任務並將它們全部合併。
在最典型的用法中,fork-join 對就像是平行遞迴函式的呼叫(fork)與回傳(join)。 與其他遞迴呼叫形式類似,回傳(連接)應先從最內層優先執行。 例如,a.fork(); b.fork(); b.join(); a.join();通常比在 之前a結合 b 的效率大幅提升。
任務的執行狀態可在多個細節層級查詢: #isDone 若任務以任何方式完成(包括任務未執行即被取消的情況),則為真; #isCompletedNormally 若任務未取消或遇到異常,則為真; #isCancelled 若任務被取消,則為真( #getException 此時回傳 a CancellationException);若 #isCompletedAbnormally 任務被取消或遇到異常,則為真, #getException 此時 會回傳遇到的例外或 CancellationException。
ForkJoinTask 類別通常不會被直接子類化。 相反地,你會將支援特定分支/連接處理風格的抽象類別子類,通常 RecursiveAction 用於大多數不會回傳結果的計算、 RecursiveTask 回傳結果的計算,以及 CountedCompleter 完成動作觸發其他動作的類別。 通常,一個具體的 ForkJoinTask 子類別會宣告由其參數組成的欄位,並在建構子中建立,然後定義一個 compute 方法,該方法以某種方式使用該基底類別提供的控制方法。
方法 #join 及其變體僅適用於完備性依賴為無環時;也就是說,平行計算可描述為有向無環圖(DAG)。 否則,執行可能會遇到某種死結,因為任務會週期性地等待彼此。 然而,此框架也支援其他方法與技術(例如使用 Phaser、 #helpQuiesce、 #complete和 ),這些方法可能有助於建構非靜態結構化為 DAG 的問題的自訂子類別。 為了支援此類使用,ForkJoinTask 可以原子 <地以 em>標籤</em> ,並以 short#setForkJoinTaskTag 或 #compareAndSetForkJoinTaskTag#getForkJoinTaskTag檢查 。 ForkJoinTask 的實作並未將這些 protected 方法或標籤用於任何目的,但它們可能在建構專門子類別時有所用處。 例如,平行圖遍歷可以利用提供的方法,避免重複檢視已處理的節點或任務。 (標記方法名稱之所以繁重,部分是為了鼓勵定義反映其使用模式的方法。)
大多數基礎支援方法都是 final為了防止與底層輕量級任務排程框架本質綁定的實作被覆寫。 開發者在創建新的基本分支/連接處理風格時,應盡量實作 protected 方法 #exec、 #setRawResult、、 #getRawResult,同時引入一個抽象的計算方法,該方法可在其子類別中實作,可能依賴該類別提供的其他 protected 方法。
ForkJoinTasks 應該執行相對較小的運算量。 大型任務應拆分成較小的子任務,通常透過遞迴分解。 作為一個非常粗略的經驗法則,一個任務應該執行超過100步或少於10000步的基本運算步驟,並且應該避免無限循環。 如果任務太大,平行性就無法提升吞吐量。 若過小,記憶體與內部任務維護負擔可能會讓處理負荷過重。
此類別提供 adapt 和 RunnableCallable的方法,在執行 與 ForkJoinTasks 其他任務時可能非常有用。 當所有任務都屬於此類形式時,考慮使用一個在 em<asyncMode>/em< 中>建構的池。
ForkJoinTasks 是 Serializable,使其能用於遠端執行框架等擴充功能中。 合理做法是只在執行前或執行後序列化任務,但不在執行過程中序列化。 序列化在執行過程中並不依賴。
在 1.7 版本中加入。
Java 文件 java.util.concurrent.ForkJoinTask。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
建構函式
| 名稱 | Description |
|---|---|
| ForkJoinTask() |
子職業呼叫的建構子。 |
| ForkJoinTask(IntPtr, JniHandleOwnership) |
用於建立 JNI 物件受管理表示的建構器;由執行時呼叫。 |
屬性
| 名稱 | Description |
|---|---|
| Class |
回傳此 |
| Exception |
回傳基礎計算拋出的例外,若被取消則 |
| ForkJoinTaskTag |
會回傳此任務的標籤。 |
| Handle |
底層 Android 實例的帳號。 (繼承來源 Object) |
| IsCancelled |
如果此任務在正常完成前被取消,則會回傳 |
| IsCompletedAbnormally |
如果此任務拋出例外或被取消,則會回傳 |
| IsCompletedNormally |
如果該任務完成且未拋出例外且未被取消,則會回傳 |
| IsDone |
如果完成此任務,則返回 |
| JniIdentityHashCode |
取得由互通執行時指派給此 Java 對等端的身份雜湊碼。 (繼承來源 Object) |
| JniManagedPeerState |
抽象基底類別,用於在 |
| JniPeerMembers |
抽象基底類別,用於在 |
| PeerReference |
取得這個 Java 節點的 JNI 物件參考。 (繼承來源 Object) |
| Pool |
回傳承載當前執行緒的池,或 |
| QueuedTaskCount |
回傳目前工作執行緒已分支但尚未執行的任務數量估計。 |
| RawRawResult |
回傳由 回 Join()傳的結果,即使該任務異常完成,或 |
| SurplusQueuedTaskCount |
回傳估計目前工作執行緒持有的本地排隊任務數量多於其他可能竊取這些執行緒的工作執行緒數量,若該執行緒未在 ForkJoinPool 中運作,則為零。 |
| ThresholdClass |
此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。 |
| ThresholdType |
此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。 |
方法
| 名稱 | Description |
|---|---|
| Adapt(ICallable) |
回傳一個新 |
| Adapt(IRunnable, Object) |
回傳一個新資料 |
| Adapt(IRunnable) |
回傳一個新 |
| AdaptInterruptible(ICallable) |
回傳一個新 |
| Cancel(Boolean) |
試圖取消執行此任務。 |
| Clone() |
建立並回傳此物件的副本。 (繼承來源 Object) |
| CompareAndSetForkJoinTaskTag(Int16, Int16) |
原子條件設定此任務的標籤值。 |
| Complete(Object) |
完成此任務,若尚未中止或取消,則回傳給定值,作為後續呼叫 |
| CompleteExceptionally(Throwable) |
會異常完成此任務,若未中止或取消,則會對相關操作拋出該異常 |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
抽象基底類別,用於在 |
| Dispose() |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| Dispose(Boolean) |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| DisposeUnlessReferenced() |
抽象基底類別,用於在 |
| Equals(Object) |
抽象基底類別,用於在 |
| Equals(Object) |
表示是否有其他物體「等同」於此物。 (繼承來源 Object) |
| ExceptionNow() |
抽象基底類別,用於在 |
| Exec() |
會立即執行該任務的基礎動作,若從此方法返回後,該任務已完成,則返回為真。 |
| 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 中運作,則會取消排程並回傳(如果有)目前執行緒排隊但尚未執行的下一個任務(如果有的話),如果有的話,則是被其他執行緒 fork 的任務。 |
| QuietlyComplete() |
通常會完成此任務,且不設定值。 |
| QuietlyInvoke() |
開始執行此任務,必要時等待完成,且不返回結果或拋棄例外。 |
| QuietlyJoin() |
加入此任務,且不返回結果或拋棄例外。 |
| QuietlyJoin(Int64, TimeUnit) |
嘗試加入此任務,若在逾時前完成(可能異常)且當前執行緒未被中斷,則回傳 true。 |
| QuietlyJoinUninterruptibly(Int64, TimeUnit) |
嘗試加入此任務,若在給定的超時前完成(可能異常完成),則返回為真。 |
| Reinitialize() |
重置此任務的內部記帳狀態,允許後續 |
| ResultNow() |
抽象基底類別,用於在 |
| SetForkJoinTaskTag(Int16) |
原子式設定此任務的標籤值並回傳舊值。 |
| SetHandle(IntPtr, JniHandleOwnership) |
設定 Handle 屬性。 (繼承來源 Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
抽象基底類別,用於在 |
| SetRawResult(Object) |
強制回傳給定值。 |
| State() |
抽象基底類別,用於在 |
| ToArray<T>() |
從這個 Java 陣列包裝器建立一個受管理陣列。 (繼承來源 Object) |
| ToString() |
回傳物件的字串表示。 (繼承來源 Object) |
| TryUnfork() |
嘗試取消排程執行此任務。 |
| 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() |
抽象基底類別,用於在 |
| IJavaPeerable.Finalized() |
抽象基底類別,用於在 |
| IJavaPeerable.JniObjectReferenceControlBlock |
抽象基底類別,用於在 |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
抽象基底類別,用於在 |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
抽象基底類別,用於在 |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
抽象基底類別,用於在 |
| IJavaPeerable.UnregisterFromRuntime() |
抽象基底類別,用於在 |
擴充方法
| 名稱 | Description |
|---|---|
| GetAsync(IFuture, Int64, TimeUnit) |
抽象基底類別,用於在 |
| GetAsync(IFuture) |
抽象基底類別,用於在 |
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
抽象基底類別,用於在 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |