當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java Java.util.concurrent.RecursiveTask用法及代碼示例


RecursiveTask是一個抽象類,封裝了一個返回結果的任務。它是 ForkJoinTask 的子類。 RecursiveTask 類經過擴展以創建具有特定返回類型的任務。表示任務計算部分的代碼保存在 RecursiveTask 的 compute() 方法中。

RecursiveTask 類主要用於並行編程環境。如果任務可以劃分為獨立的子任務,並且可以從子任務的結果中獲得任務的最終結果,那麽使用RecursiveTask可以更有效地實現。例如,在大數組中搜索元素。

類層次結構

java.lang.Object
↳ java.util.concurrent.ForkJoinTask
  ↳ java.util.concurrent.RecursiveTask<V>

構造函數

  1. RecursiveTask()- 使用默認設置創建RecursiveTask 的對象。
    public RecursiveTask()
    

方法

  1. compute()- 定義任務的方法。
    protected abstract void compute()
    
  2. exec()- 此方法實現執行任務所需的基本規則。
    protected final boolean exec()
    
  3. getRawResult()- 該函數返回任務完成後獲得的值,即使任務異常完成。如果任務尚未完成,則返回 null。
    public final Void getRawResult()
    
  4. 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



相關用法


注:本文由純淨天空篩選整理自CharchitKapoor大神的英文原創作品 Java.util.concurrent.RecursiveTask class in Java with Examples。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。