語言

RecursiveAction 類別

定義

遞迴且無 ForkJoinTask結果。

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

備註

遞迴且無 ForkJoinTask結果。 此類別建立慣例,將無結果動作參數化為 VoidForkJoinTasks。 因為 null 是類型 中唯一有效的值 Void,例如 方法 join 總是在完成後回傳 null 。

<b>範例用法。</b> 以下是一個簡單但完整的 ForkJoin 排序方法,用來排序給定 long[] 陣列:

{@code
            static class SortTask extends RecursiveAction {
              final long[] array; final int lo, hi;
              SortTask(long[] array, int lo, int hi) {
                this.array = array; this.lo = lo; this.hi = hi;
              }
              SortTask(long[] array) { this(array, 0, array.length); }
              protected void compute() {
                if (hi - lo < THRESHOLD)
                  sortSequentially(lo, hi);
                else {
                  int mid = (lo + hi) >>> 1;
                  invokeAll(new SortTask(array, lo, mid),
                            new SortTask(array, mid, hi));
                  merge(lo, mid, hi);
                }
              }
              // implementation details follow:
              static final int THRESHOLD = 1000;
              void sortSequentially(int lo, int hi) {
                Arrays.sort(array, lo, hi);
              }
              void merge(int lo, int mid, int hi) {
                long[] buf = Arrays.copyOfRange(array, lo, mid);
                for (int i = 0, j = lo, k = mid; i < buf.length; j++)
                  array[j] = (k == hi || buf[i] < array[k]) ?
                    buf[i++] : array[k++];
              }
            }}

你可以透過建立anArray並呼叫 ForkJoinPool 來排序new SortTask(anArray)。 舉個更具體簡單的例子,以下任務會遞增陣列中的每個元素:

{@code
            class IncrementTask extends RecursiveAction {
              final long[] array; final int lo, hi;
              IncrementTask(long[] array, int lo, int hi) {
                this.array = array; this.lo = lo; this.hi = hi;
              }
              protected void compute() {
                if (hi - lo < THRESHOLD) {
                  for (int i = lo; i < hi; ++i)
                    array[i]++;
                }
                else {
                  int mid = (lo + hi) >>> 1;
                  invokeAll(new IncrementTask(array, lo, mid),
                            new IncrementTask(array, mid, hi));
                }
              }
            }}

以下範例說明了一些可能提升效能的細化與慣用語:RecursiveActions 不必完全遞迴,只要維持基本的分而治之方法即可。 這裡有一個類別,透過將重複除法的右側部分細分為二,並以一連串 next 參考來追蹤,將雙重陣列中每個元素的平方相加。 它使用基於方法 getSurplusQueuedTaskCount的動態閾值,但透過直接對未竊取任務執行葉子動作,而非進一步細分,來抵消可能的過度分割。

{@code
            double sumOfSquares(ForkJoinPool pool, double[] array) {
              int n = array.length;
              Applyer a = new Applyer(array, 0, n, null);
              pool.invoke(a);
              return a.result;
            }

            class Applyer extends RecursiveAction {
              final double[] array;
              final int lo, hi;
              double result;
              Applyer next; // keeps track of right-hand-side tasks
              Applyer(double[] array, int lo, int hi, Applyer next) {
                this.array = array; this.lo = lo; this.hi = hi;
                this.next = next;
              }

              double atLeaf(int l, int h) {
                double sum = 0;
                for (int i = l; i < h; ++i) // perform leftmost base step
                  sum += array[i] * array[i];
                return sum;
              }

              protected void compute() {
                int l = lo;
                int h = hi;
                Applyer right = null;
                while (h - l > 1 && getSurplusQueuedTaskCount() <= 3) {
                  int mid = (l + h) >>> 1;
                  right = new Applyer(array, mid, h, right);
                  right.fork();
                  h = mid;
                }
                double sum = atLeaf(l, h);
                while (right != null) {
                  if (right.tryUnfork()) // directly calculate if not stolen
                    sum += right.atLeaf(right.lo, right.hi);
                  else {
                    right.join();
                    sum += right.result;
                  }
                  right = right.next;
                }
                result = sum;
              }
            }}

在 1.7 版本中加入。

的 java.util.concurrent.RecursiveActionJava 檔。

此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。

建構函式

名稱 Description
RecursiveAction()

子職業呼叫的建構子。

RecursiveAction(IntPtr, JniHandleOwnership)

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

屬性

名稱 Description
Class

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

(繼承來源 Object)
Exception

回傳基礎計算拋出的例外,若被取消則CancellationException回傳異常,若無例外則回傳 a,若方法尚未完成則為 anull。

(繼承來源 ForkJoinTask)
ForkJoinTaskTag

會回傳此任務的標籤。

(繼承來源 ForkJoinTask)
Handle

底層 Android 實例的帳號。

(繼承來源 Object)
IsCancelled

如果此任務在正常完成前被取消,則會回傳 true 。

(繼承來源 ForkJoinTask)
IsCompletedAbnormally

如果此任務拋出例外或被取消,則會回傳 true 。

(繼承來源 ForkJoinTask)
IsCompletedNormally

如果該任務完成且未拋出例外且未被取消,則會回傳 true 。

(繼承來源 ForkJoinTask)
IsDone

如果完成此任務,則返回 true 。

(繼承來源 ForkJoinTask)
JniIdentityHashCode

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

(繼承來源 Object)
JniManagedPeerState

遞迴且無 ForkJoinTask結果。

(繼承來源 JavaObject)
JniPeerMembers

遞迴且無 ForkJoinTask結果。

PeerReference

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

(繼承來源 Object)
RawRawResult

回傳由 回 Join()傳的結果,即使該任務異常完成,或 null 未知任務已完成。

(繼承來源 ForkJoinTask)
ThresholdClass

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

ThresholdType

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

方法

名稱 Description
Cancel(Boolean)

試圖取消執行此任務。

(繼承來源 ForkJoinTask)
Clone()

建立並傳回這個 對象的複本。

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

原子條件設定此任務的標籤值。

(繼承來源 ForkJoinTask)
Complete(Object)

完成此任務,若尚未中止或取消,則回傳給定值,作為後續呼叫 join 及相關操作的結果。

(繼承來源 ForkJoinTask)
CompleteExceptionally(Throwable)

會異常完成此任務,若未中止或取消,則會對相關操作拋出該異常 join 。

(繼承來源 ForkJoinTask)
Compute()

此任務主要執行計算。

Construct(JniObjectReference, JniObjectReferenceOptions)

遞迴且無 ForkJoinTask結果。

(繼承來源 JavaObject)
Dispose()

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

(繼承來源 Object)
Dispose(Boolean)

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

(繼承來源 Object)
DisposeUnlessReferenced()

遞迴且無 ForkJoinTask結果。

(繼承來源 JavaObject)
Equals(Object)

遞迴且無 ForkJoinTask結果。

(繼承來源 JavaObject)
Equals(Object)

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

(繼承來源 Object)
ExceptionNow()

遞迴且無 ForkJoinTask結果。

(繼承來源 ForkJoinTask)
Exec()

實作遞迴動作的執行慣例。

Fork()

安排在目前任務正在執行的池中非同步執行此任務(若適用),若不適用ForkJoinPool#commonPool()則使用 #inForkJoinPool 。

(繼承來源 ForkJoinTask)
Get()

必要時等待計算完成,然後取回結果。

(繼承來源 ForkJoinTask)
Get(Int64, TimeUnit)

如有需要,最多等待計算完成指定時間,然後若有結果則取回。

(繼承來源 ForkJoinTask)
GetHashCode()

傳回此物件的雜湊碼值。

(繼承來源 Object)
Invoke()

開始執行此任務,必要時等待完成,並回傳結果,或拋出(未檢查) RuntimeException 或 Error 若底層計算已完成。

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

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

(繼承來源 Object)
Join()

計算 #isDone 完成後回傳結果。

(繼承來源 ForkJoinTask)
Notify()

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

(繼承來源 Object)
NotifyAll()

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

(繼承來源 Object)
QuietlyComplete()

通常會完成此任務,且不設定值。

(繼承來源 ForkJoinTask)
QuietlyInvoke()

開始執行此任務,必要時等待完成,且不返回結果或拋棄例外。

(繼承來源 ForkJoinTask)
QuietlyJoin()

加入此任務,且不返回結果或拋棄例外。

(繼承來源 ForkJoinTask)
QuietlyJoin(Int64, TimeUnit)

嘗試加入此任務,若在逾時前完成(可能異常)且當前執行緒未被中斷,則回傳 true。

(繼承來源 ForkJoinTask)
QuietlyJoinUninterruptibly(Int64, TimeUnit)

嘗試加入此任務,若在給定的超時前完成(可能異常完成),則返回為真。

(繼承來源 ForkJoinTask)
Reinitialize()

重置此任務的內部記帳狀態,允許後續 fork的 。

(繼承來源 ForkJoinTask)
ResultNow()

遞迴且無 ForkJoinTask結果。

(繼承來源 ForkJoinTask)
SetForkJoinTaskTag(Int16)

原子式設定此任務的標籤值並回傳舊值。

(繼承來源 ForkJoinTask)
SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

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

遞迴且無 ForkJoinTask結果。

(繼承來源 JavaObject)
SetRawResult(Object)

強制回傳給定值。

(繼承來源 ForkJoinTask)
State()

遞迴且無 ForkJoinTask結果。

(繼承來源 ForkJoinTask)
ToArray<T>()

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

(繼承來源 Object)
ToString()

傳回物件的字串表示。

(繼承來源 Object)
TryUnfork()

嘗試取消排程執行此任務。

(繼承來源 ForkJoinTask)
UnregisterFromRuntime()

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

(繼承來源 Object)
Wait()

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

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

讓目前的線程等到喚醒為止,通常是因為 <em>notified</em> 或 <em>interrupted</em>,或直到經過一定數量的實時為止。

(繼承來源 Object)
Wait(Int64)

讓目前的線程等到喚醒為止,通常是因為 <em>notified</em> 或 <em>interrupted</em>,或直到經過一定數量的實時為止。

(繼承來源 Object)

明確介面實作

名稱 Description
IJavaPeerable.Disposed()

遞迴且無 ForkJoinTask結果。

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

遞迴且無 ForkJoinTask結果。

(繼承來源 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

遞迴且無 ForkJoinTask結果。

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

遞迴且無 ForkJoinTask結果。

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

遞迴且無 ForkJoinTask結果。

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

遞迴且無 ForkJoinTask結果。

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

遞迴且無 ForkJoinTask結果。

(繼承來源 ForkJoinTask)

擴充方法

名稱 Description
GetAsync(IFuture, Int64, TimeUnit)

遞迴且無 ForkJoinTask結果。

GetAsync(IFuture)

遞迴且無 ForkJoinTask結果。

GetJniTypeName(IJavaPeerable)

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

JavaAs<TResult>(IJavaPeerable)

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

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

遞迴且無 ForkJoinTask結果。

TryJavaCast<TResult>(IJavaPeerable, TResult)

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

適用於