Saltar al contenido

Java Stream API: flujos paralelos y secuenciales

este problema se puede solucionar de diversas formas, por lo tanto te dejamos la que para nosotros es la resolución más completa.

Solución:

las llamadas a sequential() y parallel() simplemente cambie el modo de toda la transmisión. Cualquiera que sea el modo en el que se encuentra el flujo cuando se invoca una operación de terminal, es el modo que se utiliza. En tu caso, desde sequential() es despues parellel() su transmisión se ejecutará secuencialmente.

Esto está documentado por el Stream interfaz:

Las canalizaciones de flujo pueden ejecutarse secuencialmente o en paralelo. Este modo de ejecución es una propiedad de la secuencia.[emphasis added]. Los flujos se crean con una opción inicial de ejecución secuencial o paralela. (Por ejemplo, Collection.stream() crea un flujo secuencial, y Collection.parallelStream() crea uno paralelo). Esta elección de modo de ejecución puede ser modificada por el BaseStream.sequential() o BaseStream.parallel() métodos, y se puede consultar con el BaseStream.isParallel() método.

Y el java.util.stream paquete:

La tubería de flujo se ejecuta secuencialmente o en paralelo según el modo del flujo en el que se invoca la operación de terminal. El modo secuencial o paralelo de un flujo se puede determinar con el BaseStream.isParallel() método, y el modo de la transmisión se puede modificar con el BaseStream.sequential() y BaseStream.parallel() operaciones. La configuración de modo paralelo o secuencial más reciente se aplica a la ejecución de toda la tubería de flujo[emphasis added].

La forma más rápida de obtener una respuesta a esa pregunta es crear una prueba muy simple. He intentado algo así:

public static void main(String args[]) 
    List list = new ArrayList<>();
    for (int i=0; i<50;i++)
        list.add(i);
    

    list.stream()
        .sequential()
        .map(a->
            System.out.println("sequential " + a); 
            return a;
        )
        .parallel()
        .forEach(a-> System.out.println("parallel " + a));
    
    System.out.println();
    System.out.println();
    
    list.stream()
        .parallel()
        .map(a->
            System.out.println("parallel " + a); 
            return a;
        )
        .sequential()
        .forEach(a-> System.out.println("sequential " + a));

Cuando ejecuta el código y analiza la salida de ambos flujos, puede ver que el primero era paralelo y el segundo era secuencial.

En base a eso podemos deducir que sólo el último parallel/sequential asuntos de llamadas: básicamente está sobrescribiendo la bandera.

Si crees que ha sido provechoso este post, te agradeceríamos que lo compartas con el resto entusiastas de la programación así nos ayudas a difundir nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *