new - ¿Dónde dice la documentación oficial que las operaciones de flujo paralelo de Java usan fork/join?
new icon java (3)
Aquí está mi comprensión del framework Stream de Java 8:
- Algo crea un Stream fuente Stream
- La implementación es responsable de proporcionar un BaseStream#parallel() , que a su vez devuelve un Stream que puede ejecutar sus operaciones en paralelo.
Si bien alguien ya ha encontrado una forma de usar un grupo de subprocesos personalizados con las ejecuciones paralelas del marco Stream, por mi vida no puedo encontrar ninguna mención en la API de Java 8 de que las implementaciones de Stream paralelas Java 8 predeterminadas usarían ForkJoinPool#commonPool() . ( Collection#parallelStream() , los métodos en la clase StreamSupport y otras posibles fuentes de flujos habilitados en paralelo en la API que no conozco).
Solo los datos que pude obtener de los resultados de búsqueda fueron estos:
Estado de la Lambda: Edición de Bibliotecas ("Paralelismo debajo del capó")
Menciona vagamente el marco Stream y la maquinaria Fork / Join.La maquinaria Fork / Join está diseñada para automatizar este proceso.
JEP 107: Operaciones de datos a granel para colecciones
Casi directamente declara que el método predeterminado de la interfaz de la Colección #parallelStream () se implementa a sí mismo usando Fork / Join. Pero todavía no hay nada sobre la piscina común.La implementación paralela se basa en la implementación Fork / Join de java.util.concurrency introducida en Java 7.
y por lo tanto: Collection#parallelStream() .
Matrices de clase (Javadoc)
Indica directamente varias veces que se utiliza el grupo común.El grupo común de ForkJoin se utiliza para ejecutar cualquier tarea paralela.
Así que mi pregunta es:
¿Dónde se dice que ForkJoinPool#commonPool() se usa para operaciones paralelas en flujos que se obtienen de la API de Java 8?
Para lo que vale, Java 8 en Acción tiene un capítulo sobre procesamiento y rendimiento de datos en paralelo (Capítulo 7). Dice:
"... la interfaz de Stream le brinda la oportunidad de ejecutar operaciones en paralelo en una recopilación de datos sin mucho esfuerzo".
"... verás cómo Java puede hacer que esta magia suceda o, más prácticamente, cómo funcionan las corrientes paralelas bajo el capó empleando el marco fork / join introducido en Java 7."
También tiene una pequeña nota al margen en la sección 7.1:
"Las transmisiones paralelas utilizan internamente el ForkJoinPool predeterminado ... que de forma predeterminada tiene tantos subprocesos como procesadores, como lo devuelve
Runtime.getRuntime().availableProcessors().
"Runtime.getRuntime().availableProcessors().
"puede cambiar el tamaño de este grupo usando la propiedad del sistema java.util .concurrent.ForkJoinPool.common.parallelism, como en el siguiente ejemplo:"
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","12");
Como se mencionó en los comentarios y otras respuestas, esto no significa que siempre usará la bifurcación / unión.
Puede verificar el código fuente de las operaciones del terminal en GrepCode. Por ejemplo, ForEachOp un vistazo a ForEachOp . Como puede ver, el método evaluarParallel de ForEachOp crea e invoca el objeto ForEachTask que se deriva de CountedCompleter derivado de ForkJoinTask.
¿Dónde está documentado que las secuencias paralelas de Java 8 utilizan FJ Framework?
Afaik (Java 1.8u5) no se menciona en el JavaDoc de las transmisiones paralelas que se usa un ForkJoinPool común.
Pero se menciona en la documentación de ForkJoin al final de here
Wrt reemplazando el grupo de subprocesos
Mi entendimiento es que puede usar un ForkJoinPool personalizado (en lugar del común) - vea el grupo de subprocesos personalizados en el flujo paralelo de Java 8 -, pero no un ThreadPool personalizado que sea diferente de la implementación de ForkJoin (aquí tengo una pregunta abierta: cómo para (globalmente) reemplazar el backend del grupo de subprocesos comunes de las secuencias paralelas de Java? )
Wrt reemplazando el api de Streams
Puede ingresar a https://github.com/nurkiewicz/LazySeq que es una implementación más de Scala Like Streams - muy agradable, muy interesante
PS (wrt ForkJoin y corrientes)
Si está interesado, me gustaría señalar que me topé con algunos problemas con el uso del grupo FJ, ver, por ejemplo,