¿Cuál es la diferencia de bajo nivel entre usar:

ForkJoinPool = new ForkJoinPool(X);

Y

ExecutorService ex = Executors.neWorkStealingPool(X);

Donde X es el nivel deseado de paralelismo, es decir, hilos que se ejecutan ..

Según los documentos, los encontré similares. También dígame cuál es más apropiado y seguro bajo cualquier uso normal. Tengo 130 millones de entradas para escribir en un BufferedWriter y ordenarlas usando Unix ordenar por primera columna.

También hágame saber cuántos hilos mantener si es posible.

Nota: Mi sistema tiene 8 procesadores principales y 32 GB de RAM.

22
bit_cracker007 27 dic. 2016 a las 03:02

3 respuestas

La mejor respuesta

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 conjunto de subprocesos clásico tiene una cola, y cada subproceso de grupo de subprocesos bloquea la cola, retira una tarea y luego desbloquea la cola. Si las tareas son cortas y hay muchas, hay mucha contención en la cola. Usar una cola sin bloqueo realmente ayuda aquí, pero no resuelve el problema por completo.

Los grupos de subprocesos modernos utilizan robo de trabajo : cada subproceso tiene su propia cola. Cuando un subproceso de grupo de subprocesos produce una tarea, la pone en cola en su propia cola. Cuando un subproceso de grupo de subprocesos desea eliminar una tarea, primero intenta eliminar una tarea de su propia cola y, si no tiene ninguno, "roba" el trabajo de otras colas de subprocesos. Esto realmente disminuye la contención del conjunto de subprocesos y mejora el rendimiento.

newWorkStealingPool crea un grupo de subprocesos que utiliza worktealing con el número de subprocesos como el número de procesadores.

newWorkStealingPool presenta un nuevo problema. Si tengo cuatro núcleos lógicos, entonces el grupo tendrá cuatro hilos en total. Si mis tareas se bloquean, por ejemplo en E / S sincrónica, no utilizo mis CPU lo suficiente. Lo que quiero son cuatro hilos activos en cualquier momento , por ejemplo, cuatro hilos que cifran AES y otros 140 hilos que esperan a que termine 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 hilos activos para saturar la CPU. Vale la pena mencionar que ForkJoinPool también utiliza el robo de trabajo.

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

Y después de que se haya dicho algo, las aplicaciones modernas tienden a usar un grupo de subprocesos con la cantidad de procesadores disponibles y utilizan E / S asíncronas y contenedores sin bloqueo para evitar el bloqueo. esto (generalmente) brinda el mejor rendimiento.

33
RubioRic 16 dic. 2019 a las 13:48

Es solo una abstracción para el Framework Fork / Join ...

/**
* 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);
}
2
Beniamin H 18 ene. 2019 a las 08:09

newWorkStealingPool es un nivel más alto de abstracción para ForkJoinPool.

Si observa la implementación de Oracle jvm, es simplemente un ForkJoinPool preconfigurado:

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

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

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

4
RubioRic 16 dic. 2019 a las 13:45