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.