tutorial streams procesamiento parte libreria funcional ejercicios ejemplo datos con java multithreading java-8 java.util.concurrent

streams - ¿Cuántos hilos se generan en parallelStream en Java 8?



procesamiento de datos con streams de java se 8-parte 2 (2)

En JDK8, ¿cuántos subprocesos se generan cuando estoy usando parallelStream? Por ejemplo, en el código:

list.parallelStream().forEach(/** Do Something */);

Si esta lista tiene 100000 artículos, ¿cuántos hilos se generarán?

Además, ¿cada uno de los hilos obtiene la misma cantidad de elementos para trabajar o se asigna aleatoriamente?


La implementación de Oracle de la secuencia paralela [1] utiliza el subproceso actual y además de eso, si es necesario, también los subprocesos que componen el grupo de unión de horquilla predeterminado ForkJoinPool.commonPool() , que tiene un tamaño predeterminado igual a uno menos que el número de núcleos de tu CPU.

Ese tamaño predeterminado del grupo común se puede cambiar con esta propiedad:

-Djava.util.concurrent.ForkJoinPool.common.parallelism=8

Alternativamente, puede usar su propio grupo:

ForkJoinPool myPool = new ForkJoinPool(8); myPool.submit(() -> list.parallelStream().forEach(/* Do Something */); ).get();

En cuanto a la orden, los trabajos se ejecutarán tan pronto como haya un hilo disponible, sin un orden específico.

Como señaló correctamente @Holger, este es un detalle específico de la implementación (con solo una vaga referencia en la parte inferior de un documento), ambos enfoques funcionarán en la JVM de Oracle, pero definitivamente no se garantiza que funcionen en las JVM de otros proveedores, la propiedad podría no existe en una implementación que no sea de Oracle y Streams ni siquiera podría usar un ForkJoinPool internamente, lo que hace que la alternativa basada en el comportamiento de ForkJoinTask.fork completamente inútil ( consulte aquí para obtener más información al respecto).


Si bien @uraimo es correcto, la respuesta depende exactamente de lo que hace "Do Something". La API parallel.streams usa la clase CountedCompleter que tiene algunos problemas interesantes. Dado que el marco F / J no utiliza un objeto separado para mantener los resultados, las cadenas largas pueden generar un OOME. Además, esas cadenas largas a veces pueden causar un desbordamiento de pila. La respuesta a esos problemas es el uso de la técnica Paraquential como señalé en este artículo.

El otro problema es la creación excesiva de subprocesos cuando se usa paralelo anidado para cada uno.