RecursiveTask是一個抽象類,封裝了一個返回結果的任務。它是 ForkJoinTask 的子類。 RecursiveTask 類經過擴展以創建具有特定返回類型的任務。表示任務計算部分的代碼保存在 RecursiveTask 的 compute() 方法中。
RecursiveTask 類主要用於並行編程環境。如果任務可以劃分為獨立的子任務,並且可以從子任務的結果中獲得任務的最終結果,那麽使用RecursiveTask可以更有效地實現。例如,在大數組中搜索元素。
類層次結構
java.lang.Object ↳ java.util.concurrent.ForkJoinTask ↳ java.util.concurrent.RecursiveTask<V>
構造函數
-
RecursiveTask()- 使用默認設置創建RecursiveTask 的對象。
public RecursiveTask()
方法
- compute()- 定義任務的方法。
protected abstract void compute()
-
exec()- 此方法實現執行任務所需的基本規則。
protected final boolean exec()
-
getRawResult()- 該函數返回任務完成後獲得的值,即使任務異常完成。如果任務尚未完成,則返回 null。
public final Void getRawResult()
-
setRawResult()- 該函數將任務的返回值設置為參數中傳遞的值。
protected final void setRawResult(Void mustBeNull)
演示RecursiveTask的示例
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
public class RecursiveTaskDemo {
public static void main(String[] args)
{
ForkJoinPool fjp = new ForkJoinPool();
double[] nums = new double[5000];
for (int i = 0; i < nums.length; i++) {
nums[i] = (double)(((i % 2) == 0) ? i : -1);
}
Sum task = new Sum(nums, 0, nums.length);
double summation = fjp.invoke(task);
System.out.println("Summation " + summation);
}
}
class Sum extends RecursiveTask<Double> {
final int seqThreshold = 500;
double[] data;
int start, end;
Sum(double[] data, int start, int end)
{
this.data = data;
this.start = start;
this.end = end;
}
@Override
protected Double compute()
{
double sum = 0;
if ((end - start) < seqThreshold) {
for (int i = start; i < end; i++)
sum += data[i];
}
else {
int middle = (start + end) / 2;
Sum subtaskA = new Sum(data, start, middle);
Sum subtaskB = new Sum(data, middle, end);
subtaskA.fork();
subtaskB.fork();
sum += subtaskA.join() + subtaskB.join();
}
return sum;
}
}
輸出:
Summation 6245000.0
參考: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/RecursiveTask.html
相關用法
- Java Java.util.concurrent.RecursiveAction用法及代碼示例
- Java Java.util.concurrent.Phaser用法及代碼示例
- Java Java.util.concurrent.CyclicBarrier用法及代碼示例
- Java Java.util.ArrayDeque.add()用法及代碼示例
- Java Java.util.ArrayDeque.addFirst()用法及代碼示例
- Java Java.util.ArrayDeque.addLast()用法及代碼示例
- Java Java.util.ArrayDeque.clear()用法及代碼示例
- Java Java.util.ArrayDeque.clone()用法及代碼示例
- Java Java.util.ArrayDeque.descendingIterator()用法及代碼示例
- Java Java.util.ArrayDeque.element()用法及代碼示例
- Java Java.util.ArrayDeque.getFirst()用法及代碼示例
- Java Java.util.ArrayDeque.getLast()用法及代碼示例
- Java Java.util.ArrayDeque.isEmpty()用法及代碼示例
- Java Java.util.ArrayDeque.iterator()用法及代碼示例
- Java Java.util.ArrayDeque.peek()用法及代碼示例
- Java Java.util.ArrayDeque.peekFirst()用法及代碼示例
- Java Java.util.ArrayDeque.peekLast()用法及代碼示例
- Java Java.util.ArrayDeque.poll()用法及代碼示例
- Java Java.util.ArrayDeque.pollFirst()用法及代碼示例
- Java Java.util.ArrayDeque.pollLast()用法及代碼示例
- Java Java.util.ArrayDeque.pop()用法及代碼示例
- Java Java.util.ArrayDeque.push()用法及代碼示例
- Java Java.util.ArrayDeque.remove()用法及代碼示例
- Java Java.util.ArrayDeque.removeFirst()用法及代碼示例
- Java Java.util.ArrayDeque.removeLast()用法及代碼示例
注:本文由純淨天空篩選整理自CharchitKapoor大神的英文原創作品 Java.util.concurrent.RecursiveTask class in Java with Examples。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。