Creación de streams paralelos
parallel() y parallelStream()
Creación de streams paralelos es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.
Qué hacen los streams paralelos
Un stream paralelo divide sus datos y procesa los fragmentos en varios hilos; después combina los resultados. El objetivo es lograr un mayor rendimiento con cargas de trabajo grandes.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int sum = IntStream.rangeClosed(1, 1000)
.parallel()
.sum();
System.out.println(sum);
}
}parallel() en un stream existente
Llamar a parallel() convierte un stream secuencial en uno paralelo. Puede aparecer en cualquier lugar del pipeline.
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> nums = List.of(1, 2, 3, 4, 5);
int total = nums.stream()
.parallel()
.mapToInt(Integer::intValue)
.sum();
System.out.println(total);
}
}parallelStream() en colecciones
Collection.parallelStream() crea directamente un stream paralelo, como una abreviatura de stream().parallel().
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> words = List.of("a", "bb", "ccc");
int chars = words.parallelStream()
.mapToInt(String::length)
.sum();
System.out.println(chars);
}
}Volver al modo secuencial
sequential() devuelve un stream a la ejecución con un solo hilo. La última llamada a parallel() o sequential() prevalece para todo el pipeline.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int sum = IntStream.rangeClosed(1, 100)
.parallel()
.sequential()
.sum();
System.out.println(sum);
}
}Comprobar isParallel
isParallel() indica si un stream se ejecutará en paralelo.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
System.out.println(IntStream.range(0, 10).isParallel());
System.out.println(IntStream.range(0, 10).parallel().isParallel());
}
}Mismo resultado, ejecución diferente
Para operaciones asociativas, como la suma, los streams paralelos y secuenciales devuelven el mismo resultado. Solo cambia la estrategia de ejecución.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int seq = IntStream.rangeClosed(1, 50).sum();
int par = IntStream.rangeClosed(1, 50).parallel().sum();
System.out.println(seq == par);
}
}El ForkJoinPool común
Los streams paralelos usan el ForkJoinPool.commonPool() compartido. Su tamaño predeterminado es el número de procesadores disponibles menos uno.
public class Main {
public static void main(String[] args) {
System.out.println(Runtime.getRuntime().availableProcessors());
}
}El orden de los hilos no está garantizado
Con forEach, los streams paralelos pueden imprimir en cualquier orden, porque los fragmentos terminan en momentos distintos. Use forEachOrdered si el orden es importante.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
IntStream.rangeClosed(1, 5)
.parallel()
.forEachOrdered(System.out::println);
}
}La reducción combina resultados parciales
Internamente, la reducción paralela calcula resultados parciales para cada fragmento y los combina mediante el combinador. Para que sea correcta, la operación debe ser asociativa.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int product = IntStream.rangeClosed(1, 6)
.parallel()
.reduce(1, (a, b) -> a * b);
System.out.println(product);
}
}Recopilar en paralelo
El framework de collectors admite la recopilación en paralelo mediante la combinación de contenedores parciales. groupingBy funciona correctamente en paralelo.
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> words = List.of("apple", "banana", "avocado", "cherry");
Map<Character, List<String>> byFirst = words.parallelStream()
.collect(Collectors.groupingBy(w -> w.charAt(0)));
System.out.println(byFirst);
}
}No todos los streams son más rápidos
Activar el paralelismo es sencillo, pero no siempre resulta beneficioso. Los conjuntos de datos pequeños o las operaciones económicas pueden ser más lentos en paralelo debido al coste de dividir y combinar.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
long count = IntStream.rangeClosed(1, 10)
.parallel()
.filter(n -> n % 2 == 0)
.count();
System.out.println(count);
}
}Comprobación rápida
¿Qué pool de hilos ejecuta los streams paralelos de forma predeterminada?
Resumen
Ha creado streams paralelos:
parallel()convierte cualquier stream;parallelStream()es una abreviatura para colecciones.sequential()revierte el modo paralelo; la última llamada prevalece.- Se ejecutan en el
ForkJoinPool.commonPool()compartido. - Los resultados coinciden con los secuenciales en operaciones asociativas, pero el orden y la velocidad no están garantizados.
Preguntas frecuentes
¿La lección «Creación de streams paralelos» es gratis?
Sí — el texto completo de «Creación de streams paralelos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Creación de streams paralelos»?
parallel() y parallelStream() Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Java Academy?
No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Creación de streams paralelos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Java Academy?
Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Creación de streams paralelos
- Cuándo ayuda el paralelismo
- Seguridad de hilos y efectos secundarios
- Errores comunes