Рубрики

Класс Java.util.concurrent.RecursiveTask в Java с примерами

RecursiveTask — это абстрактный класс, инкапсулирующий задачу, которая возвращает результат. Это подкласс ForkJoinTask. Класс RecursiveTask расширен для создания задачи с определенным типом возврата. Код, представляющий вычислительную часть задачи, хранится в методе compute () RecursiveTask.

Класс 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 () — функция возвращает значение, полученное после завершения задачи, даже если задача выполнена ненормально. Возвращает ноль, если задача еще не завершена.
    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

Рекомендуемые посты:

Класс Java.util.concurrent.RecursiveTask в Java с примерами

0.00 (0%) 0 votes