Clase ForkJoinPool en Java con ejemplos

La clase ForkJoinPool es el centro del marco fork/join, que es una implementación de la interfaz ExecutorService. La clase ForkJoinPool es una extensión de la clase AbstractExecutorService e implementa el algoritmo de robo de trabajo (es decir, los subprocesos de trabajo que se quedan sin cosas que hacer pueden robar tareas de otros subprocesos que todavía están ocupados) del marco fork/join y puede ejecutar ForkJoinTask procesos.

La clase ForkJoinPool hereda los siguientes métodos de la clase java.util.concurrent.AbstractExecutorService:

  • invocarTodo()
  • invocarCualquiera()

La clase ForkJoinPool hereda los siguientes métodos de Métodos heredados de la clase java.lang.Object class:

  • clon()
  • es igual()
  • finalizar()
  • obtenerClase()
  • código hash()
  • notificar()
  • notificar a todos()
  • Espere()

Sintaxis:

public class ForkJoinPool extends AbstractExecutorService  

Bifurcación: el paso de bifurcación divide la tarea en subtareas más pequeñas y estas tareas se ejecutan simultáneamente. 

Unir: después de la ejecución de las subtareas, la tarea puede unir todos los resultados en un solo resultado.

Esto se ilustra en el siguiente diagrama:

ForkJoinPool-Class-in-Java-with-Examples

Ejemplo:

getActiveThreadCount(): este método devuelve una cantidad estimada de subprocesos que actualmente están robando o ejecutando tareas. Puede sobrestimar el número de subprocesos activos.

Sintaxis

public int getActiveThreadCount()

Java

// Java program to demonstrate the
// Implementation of getActiveThreadCount()
 
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
class NewTask extends RecursiveAction
{
    private long Load = 0;
     
    public NewTask(long Load) { this.Load = Load; }
 
    protected void compute()
    {
        // fork tasks into smaller subtasks
        List<NewTask> subtasks = new ArrayList<NewTask>();
        subtasks.addAll(createSubtasks());
         
        for (RecursiveAction subtask : subtasks) {
            subtask.fork();
        }
    }
     
    // function to create and add subtasks
    private List<NewTask> createSubtasks()
    {
        // create subtasks
        List<NewTask> subtasks = new ArrayList<NewTask>();
        NewTask subtask1 = new NewTask(this.Load / 2);
        NewTask subtask2 = new NewTask(this.Load / 2);
        NewTask subtask3 = new NewTask(this.Load / 2);
         
        // to add the subtasks
        subtasks.add(subtask1);
        subtasks.add(subtask2);
        subtasks.add(subtask3);
         
        return subtasks;
    }
}
public class JavaForkJoingetActivethreadcountExample1 {
    public static void main(final String[] arguments)
        throws InterruptedException
    {
        // get no. of available core available
        int proc = Runtime.getRuntime().availableProcessors();
         
        System.out.println("Number of available core in the processor is: "
            + proc);
             
        // get no. of threads active
        ForkJoinPool Pool = ForkJoinPool.commonPool();
         
        System.out.println("Number of active thread before invoking: "
            + Pool.getActiveThreadCount());
             
        NewTask t = new NewTask(400);
         
        Pool.invoke(t);
         
        System.out.println("Number of active thread after invoking: "
            + Pool.getActiveThreadCount());
        System.out.println("Common Pool Size is: "
                           + Pool.getPoolSize());
    }
}
Producción

Number of available core in the processor is: 4
Number of active thread before invoking: 0
Number of active thread after invoking: 3
Common Pool Size is: 3

Métodos de la clase ForkJoinPool

MÉTODO

DESCRIPCIÓN

public boolean awaitQuiescence (tiempo de espera prolongado, unidad TimeUnit) Este método ejecuta el grupo hasta que el grupo está inactivo; de lo contrario, ayuda a realizar tareas hasta que transcurre el valor de tiempo y la unidad especificados o el grupo está inactivo.
awaitTermination booleano público (tiempo de espera prolongado, unidad TimeUnit)  Este método bloquea hasta que todas las tareas hayan completado la ejecución después de una solicitud de cierre, se agote el tiempo de espera o se interrumpa el subproceso actual, lo que ocurra primero.
public static ForkJoinPool commonPool() Este método devuelve la instancia del grupo común.
ejecución de vacío público (tarea ejecutable) Este método ejecuta el comando dado en algún momento en el futuro.
público int getActiveThreadCount() Este método devuelve una cantidad estimada de subprocesos que actualmente están robando o ejecutando tareas. Puede sobrestimar el número de subprocesos activos.
booleano público getAsyncMode() Este método devuelve verdadero si este grupo usa el modo de programación local primero en entrar, primero en salir para tareas bifurcadas que nunca se unen.
público estático int getCommonPoolParallelism() Este método devuelve el nivel de paralelismo objetivo del grupo común.
público ForkJoinPool.ForkJoinWorkerThreadFactory getFactory() Este método devuelve la fábrica utilizada para construir nuevos trabajadores.
public int getParallelism() Este método devuelve el nivel de paralelismo objetivo de este grupo.
público int getPoolSize() Este método devuelve la cantidad de subprocesos de trabajo que se iniciaron pero aún no terminaron.
público int getQueuedSubmissionCount() Este método devuelve una estimación de la cantidad de tareas enviadas a este grupo que aún no han comenzado a ejecutarse.
getQueuedTaskCount largo público() Este método devuelve una estimación del número total de tareas actualmente en cola por subprocesos de trabajo
público int getRunningThreadCount() Este método devuelve una estimación de la cantidad de subprocesos de trabajo que no están bloqueados esperando para unirse a tareas o para otra sincronización administrada.
getRobarContador público largo() Este método devuelve una estimación del número total de tareas robadas de la cola de trabajo de un subproceso por otro.
Subproceso público.UncaughtExceptionHandler getUncaughtExceptionHandler() Este método devuelve el controlador de subprocesos de trabajo internos que terminan debido a errores irrecuperables encontrados al ejecutar tareas.
booleano público hasQueuedSubmissions() Este método devuelve verdadero si hay tareas enviadas a este grupo que aún no han comenzado a ejecutarse.
pública <T> T invocar (tarea ForkJoinTask<T>) Este método realiza la tarea dada y devuelve su resultado al finalizar.
público booleano isQuiescent() Este método devuelve verdadero si todos los subprocesos de trabajo están actualmente inactivos.
público booleano isShutdown() Este método devuelve verdadero si el grupo que llama a isShutdown() se ha cerrado.
booleano público estáTerminado() Este método devuelve verdadero si todas las tareas se completaron después del apagado.
booleano público estáTerminando() Este método devuelve verdadero si el proceso de terminación ha comenzado pero aún no se ha completado. 
protegido <T> RunnableFuture<T> newTaskFor(Callable<T> callable) Este método devuelve un RunnableFuture que, cuando se ejecuta, llamará al invocable subyacente y que, como Future, generará el resultado del invocable como su resultado y permitirá la cancelación de la tarea subyacente.
cierre de vacío público() Este método devuelve verdadero si este grupo se cerró.
lista pública<ejecutable> shutdownNow() Es posible que este método intente cancelar y/o detener todas las tareas y rechazar todas las tareas enviadas posteriormente.
public ForkJoinTask<?> enviar (tarea ejecutable) Este método envía una tarea ejecutable para su ejecución y devuelve un futuro que representa esa tarea.
String pública a String() Este método devuelve una string que identifica este grupo, así como su estado, incluidas las indicaciones del estado de ejecución, el nivel de paralelismo y el número de trabajadores y tareas.

Publicación traducida automáticamente

Artículo escrito por surbhityagi15 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 *