¿Cuál es la ventaja de un Java-5 ThreadPoolExecutor sobre un Java-7 ForkJoinPool?



Answers

Lectura recomendada http://gee.cs.oswego.edu/dl/jsr166/dist/docs/ De los documentos para ForkJoinPool:

Un ForkJoinPool difiere de otros tipos de ExecutorService principalmente en virtud del empleo de robo de trabajo: todos los subprocesos del grupo intentan encontrar y ejecutar tareas enviadas al grupo y / o creadas por otras tareas activas (eventualmente bloqueando la espera de trabajo si no existe) . Esto permite un procesamiento eficiente cuando la mayoría de las tareas generan otras subtareas (como la mayoría de ForkJoinTasks), así como cuando se envían muchas tareas pequeñas al grupo desde clientes externos. Especialmente cuando se establece asyncMode en true en los constructores, ForkJoinPools también puede ser apropiado para usar con tareas de eventos que nunca se unen.

El marco de unión de horquilla es útil para la ejecución en paralelo, mientras que el servicio de ejecutor permite la ejecución simultánea y existe una diferencia. Mira esto y esto .

El marco de unión de la horquilla también permite el robo de trabajo (uso de una Deque).

Este artículo es una buena lectura.

Question

Java 5 ha introducido soporte para la ejecución asíncrona de tareas por un grupo de subprocesos en la forma del marco Ejecutor, cuyo corazón es el grupo de subprocesos implementado por java.util.concurrent.ThreadPoolExecutor. Java 7 ha agregado un grupo de subprocesos alternativo en la forma de java.util.concurrent.ForkJoinPool.

En cuanto a su respectiva API, ForkJoinPool proporciona un superconjunto de la funcionalidad de ThreadPoolExecutor en escenarios estándar (aunque estrictamente hablando, ThreadPoolExecutor ofrece más oportunidades de ajuste que ForkJoinPool). Agregando a esto la observación de que las tareas fork / join parecen ser más rápidas (posiblemente debido al programador de robo de trabajo), necesitan definitivamente menos subprocesos (debido a la operación de unión no bloqueante), uno puede tener la impresión de que ThreadPoolExecutor ha sido reemplazado por ForkJoinPool.

¿Pero esto es realmente correcto? Todo el material que he leído parece resumir una distinción bastante vaga entre los dos tipos de grupos de hilos:

  • ForkJoinPool es para muchas tareas dependientes, generadas por tareas, breves, casi nunca bloqueantes (es decir, intensivas en cómputo)
  • ThreadPoolExecutor es para pocas tareas independientes, generadas externamente, largas, a veces bloqueantes

¿Es esta distinción correcta en absoluto? ¿Podemos decir algo más específico sobre esto?




Comparemos las diferencias en constructores:

ThreadPoolExecutor

ThreadPoolExecutor(int corePoolSize, 
                   int maximumPoolSize, 
                   long keepAliveTime, 
                   TimeUnit unit, 
                   BlockingQueue<Runnable> workQueue, 
                   ThreadFactory threadFactory,
                   RejectedExecutionHandler handler)

ForkJoinPool

ForkJoinPool(int parallelism,
            ForkJoinPool.ForkJoinWorkerThreadFactory factory,
            Thread.UncaughtExceptionHandler handler,
            boolean asyncMode)

La única ventaja que he visto en ForkJoinPool : Mecanismo de robo de trabajo por hilos inactivos.

Java 8 ha introducido una API más en los ejecutores - newWorkStealingPool para crear pool de robo de trabajo. No tiene que crear RecursiveTask y RecursiveAction pero aún puede usar ForkJoinPool .

public static ExecutorService newWorkStealingPool()

Crea un grupo de subprocesos de robo de trabajo utilizando todos los procesadores disponibles como su nivel de paralelismo de destino.

Ventajas de ThreadPoolExecutor sobre ForkJoinPool:

  1. Puede controlar el tamaño de la cola de tareas en ThreadPoolExecutor diferencia de ForkJoinPool .
  2. Puede aplicar la política de rechazo cuando se agote su capacidad a diferencia de ForkJoinPool

Me gustan estas dos características en ThreadPoolExecutor que mantiene la salud del sistema en buen estado.

EDITAR:

Eche un vistazo a este artículo para casos de uso de varios tipos de grupos de hilos del Servicio Executor y evaluación de las características del Pool ForkJoin .




Links