Java Parallel Streams es una característica de Java 8 y superior, diseñada para utilizar varios núcleos del procesador. Normalmente, cualquier código Java tiene un flujo de procesamiento, donde se ejecuta secuencialmente. Mientras que al usar flujos paralelos, podemos dividir el código en múltiples flujos que se ejecutan en paralelo en núcleos separados y el resultado final es la combinación de los resultados individuales. Sin embargo, el orden de ejecución no está bajo nuestro control.
Por lo tanto, es recomendable utilizar secuencias paralelas en los casos en que, independientemente del orden de ejecución, el resultado no se ve afectado y el estado de un elemento no afecta al otro, así como la fuente de los datos tampoco se ve afectada.
¿Por qué flujos paralelos?
Las secuencias paralelas se introdujeron para aumentar el rendimiento de un programa, pero optar por secuencias paralelas no siempre es la mejor opción. Hay ciertos casos en los que necesitamos que el código se ejecute en un cierto orden y, en estos casos, es mejor usar flujos secuenciales para realizar nuestra tarea a costa del rendimiento. La diferencia de rendimiento entre los dos tipos de flujos solo es importante para programas a gran escala o proyectos complejos. Para programas a pequeña escala, es posible que ni siquiera se note. Básicamente, debe considerar usar flujos paralelos cuando el flujo secuencial se comporta mal.
Formas de crear flujo
Hay dos formas en que podemos crear, que se enumeran a continuación y se describen más adelante de la siguiente manera:
- Usando el método paralelo() en una secuencia
- Uso de parallelStream() en una colección
Método 1: usar el método paralelo() en una secuencia
El método paralelo() de la interfaz BaseStream devuelve un flujo paralelo equivalente. Expliquemos cómo funcionaría con la ayuda de un ejemplo.
En el código que se proporciona a continuación, creamos un objeto de archivo que apunta a un archivo ‘txt’ preexistente en el sistema. Luego creamos un Stream que lee del archivo de texto una línea a la vez. Luego usamos el método paralelo() para imprimir el archivo leído en la consola. El orden de ejecución es diferente para cada ejecución, puede observar esto en la salida. Las dos salidas dadas a continuación tienen diferentes órdenes de ejecución.
Ejemplo
Java
// Java Program to Illustrate Parallel Streams // Using parallel() method on a Stream // Importing required classes import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.stream.Stream; // Main class // ParallelStreamTest public class GFG { // Main driver method public static void main(String[] args) throws IOException { // Creating a File object File fileName = new File("M:\\Documents\\Textfile.txt"); // Create a Stream of string type // using the lines() method to // read one line at a time from the text file Stream<String> text = Files.lines(fileName.toPath()); // Creating parallel streams using parallel() method // later using forEach() to print on console text.parallel().forEach(System.out::println); // Closing the Stream // using close() method text.close(); } }
Producción:
1A
1B
Método 2: Uso de parallelStream() en una colección
El método parallelStream() de la interfaz Collection devuelve un posible flujo paralelo con la colección como fuente. Expliquemos el funcionamiento con la ayuda de un ejemplo.
Implementación:
En el código que se proporciona a continuación, nuevamente estamos usando secuencias paralelas, pero aquí estamos usando una Lista para leer el archivo de texto. Por lo tanto, necesitamos el método parallelStream().
Ejemplo
Java
// Java Program to Illustrate Parallel Streams // using parallelStream() method on a Stream // Importing required classes import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.*; // Main class // ParallelStreamsTest public class GFG { // Main driver method public static void main(String[] args) throws IOException { // Creating a File object File fileName = new File("M:\\Documents\\List_Textfile.txt"); // Reading the lines of the text file by // create a List using readAllLines() method List<String> text = Files.readAllLines(fileName.toPath()); // Creating parallel streams by creating a List // using readAllLines() method text.parallelStream().forEach(System.out::println); } }
Producción:
Publicación traducida automáticamente
Artículo escrito por ManasiKirloskar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA