Clase Java.util.concurrent.RecursiveAction en Java con ejemplos

RecursiveAction es una clase abstracta que encapsula una tarea que no devuelve un resultado. Es una subclase de ForkJoinTask , que es una clase abstracta que representa una tarea que se puede ejecutar en un núcleo separado en un sistema multinúcleo. La clase RecursiveAction se amplía para crear una tarea que tiene un tipo de retorno nulo . El código que representa la parte computacional de la tarea se mantiene dentro del método compute() de RecursiveAction.

RecursiveAction se utiliza para tareas que se pueden dividir y ejecutar en paralelo. Estas tareas no deberían devolver ningún valor. Por ejemplo, la clasificación de una array grande se puede implementar fácilmente con RecursiveAction, dividiendo la array en pequeños fragmentos manejables y clasificando cada parte en un núcleo separado.

Jerarquía de clases

java.lang.Object
↳ java.util.concurrent.ForkJoinTask<Void>
  ↳ java.util.concurrent.RecursiveAction

Constructor de RecursiveAction:

  1. RecursiveAction : crea un objeto de RecursiveAction con la configuración predeterminada.

    Sintaxis:

    public RecursiveAction()
    

Métodos

  1. computar() : es el método que realiza el cálculo realizado por la tarea.

    Sintaxis:

    protected abstract void compute()
    
  2. exec() : este método implementa las reglas básicas necesarias para la ejecución de una tarea para RecursiveAction.

    Sintaxis:

    protected final boolean exec()
    
  3. getRawResult() : la función devuelve el estado de finalización de la tarea. Siempre devuelve nulo.

    Sintaxis:

    public final Void getRawResult()
    
  4. setRawResult() : la función establece el estado de finalización de la tarea en el valor pasado en el argumento.

    Sintaxis:

    protected final void setRawResult(Void mustBeNull)
    

Ejemplo : para demostrar la clase RecursiveAction

// Java program to demonstrate RecursiveAction Class
  
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
  
public class ForkJoinDemo {
    public static void main(String[] args)
    {
        // Create a pool of threads.
        ForkJoinPool fjp = new ForkJoinPool();
        double[] nums = new double[100000];
  
        // Give nums some values
        for (int i = 0; i < nums.length; i++) {
            nums[i] = (double)i;
        }
        System.out.println("A portion of the original sequence");
        for (int i = 0; i < 9; i++) {
            System.out.print(nums[i] + " ");
        }
        System.out.println();
        SqrtTransform task
            = new SqrtTransform(nums, 0, nums.length);
  
        // Start the task
        fjp.invoke(task);
        System.out.println("A portion of the transformed sequence"
                           + " (to four decimal places): ");
        for (int i = 0; i < 9; i++) {
            System.out.printf("%.4f ", nums[i]);
        }
        System.out.println();
    }
}
  
// A task that transforms the elements into their square roots
class SqrtTransform extends RecursiveAction {
    final int seqThreshold = 1000;
  
    double[] data;
  
    // Determines what part of data to process
    int start, end;
  
    SqrtTransform(double[] data, int start, int end)
    {
        this.data = data;
        this.start = start;
        this.end = end;
    }
  
    // The method where parallel computation will occur
    @Override
    protected void compute()
    {
        // If the number of elements are less
        // than the sequential threshold
        if ((end - start) < seqThreshold) {
            for (int i = start; i < end; i++) {
                data[i] = Math.sqrt(data[i]);
            }
        }
        else {
            // Otherwise, continue to break the data into smaller pieces
            // Find the midpoint
            int middle = (start + end) / 2;
  
            // Invoke new tasks, using the subdivided tasks.
            invokeAll(new SqrtTransform(data, start, middle),
                      new SqrtTransform(data, middle, end));
        }
    }
}
Producción:

A portion of the original sequence
0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 
A portion of the transformed sequence (to four decimal places): 
0.0000 1.0000 1.4142 1.7321 2.0000 2.2361 2.4495 2.6458 2.8284 

Referencia: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/RecursiveAction.html

Publicación traducida automáticamente

Artículo escrito por CharchitKapoor y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *