Saltar al contenido

¿Diferencia detallada entre Java8 ForkJoinPool y Executors.newWorkStealingPool?

Si hallas algún problema con tu código o proyecto, recuerda probar siempre en un ambiente de testing antes subir el código al proyecto final.

Solución:

El robo de trabajo es una técnica utilizada por los grupos de subprocesos modernos para disminuir la contención en la cola de trabajo.

Un grupo de subprocesos clásico tiene una cola, y cada subproceso del grupo de subprocesos bloquea la cola, elimina una tarea y luego desbloquea la cola. Si las tareas son cortas y hay muchas, hay mucha contención en la cola. Usando un sin bloqueo queue realmente ayuda aquí, pero no resuelve el problema por completo.

Uso de grupos de subprocesos modernos trabajo robando – cada hilo tiene su propia cola. Cuando un subproceso de threadpool produce una tarea, la pone en cola en su propia cola. Cuando un subproceso de subproceso quiere eliminar una tarea, primero intenta eliminar una tarea de su propia cola y, si no tiene ninguna, “roba” el trabajo de otras colas de subprocesos. Esto realmente disminuye la contención del grupo de subprocesos y mejora el rendimiento.

newWorkStealingPool crea un grupo de subprocesos que utiliza el robo de trabajo con la cantidad de subprocesos como la cantidad de procesadores.

newWorkStealingPool presenta un nuevo problema. Si tengo cuatro núcleos lógicos, el grupo tendrá cuatro subprocesos en total. Si mis tareas se bloquean, por ejemplo, en IO síncrono, no utilizo mis CPU lo suficiente. lo que quiero son cuatro activo hilos en cualquier momento dadopor ejemplo, cuatro subprocesos que cifran AES y otros 140 subprocesos que esperan a que finalice el IO.

Esto es lo que ForkJoinPool proporciona: si su tarea genera nuevas tareas y esa tarea espera a que finalicen, el grupo inyectará nuevos subprocesos activos para saturar la CPU. Vale la pena mencionar que ForkJoinPool utiliza el robo de trabajo también.

¿Cuál usar? Si trabaja con el modelo fork-join o sabe que sus tareas se bloquean indefinidamente, use el ForkJoinPool. Si sus tareas son cortas y en su mayoría están vinculadas a la CPU, use newWorkStealingPool.

Y después de todo lo que se ha dicho, las aplicaciones modernas tienden a usar un grupo de subprocesos con la cantidad de procesadores disponibles y utilizan E/S asíncrona y contenedores sin candado para evitar el bloqueo. esto (normalmente) da el mejor rendimiento.

newWorkStealingPool es un mayor nivel de abstracción para ForkJoinPool.

Si observa la implementación de Oracle jvm, es simplemente una configuración preconfigurada ForkJoinPool:

public static ExecutorService newWorkStealingPool() 
    return new ForkJoinPool(Runtime.getRuntime().availableProcessors(),
                            ForkJoinPool.defaultForkJoinWorkerThreadFactory,
                            null, 
                            true);

Desafortunadamente, observar las implementaciones no es una forma adecuada de comprender el propósito de una clase.

También crédito a: https://dzone.com/articles/diving-into-java-8s-newworkstealingpools

Es solo una abstracción para Fork/Join Framework…

/**
* Creates a work-stealing thread pool using all
* @link Runtime#availableProcessors available processors
* as its target parallelism level.
* @return the newly created thread pool
* @see #newWorkStealingPool(int)
* @since 1.8
*/
public static ExecutorService newWorkStealingPool() 
    return new ForkJoinPool(Runtime.getRuntime().availableProcessors(),
                            ForkJoinPool.defaultForkJoinWorkerThreadFactory,
                            null, true);

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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