API Stream Paralleli
Probabilmente hai già familiarità con la Stream API, i suoi metodi e il suo funzionamento (In caso contrario, studia prima questo argomento e poi torna a questo capitolo).
Un flusso di dati regolare non è parallelo, cioè, per quanto possa essere comodo ed elegante nel codice, utilizzare la Stream API senza il metodo parallelStream() su grandi quantità di dati può influire notevolmente sulle prestazioni.
Esiste anche un metodo parallel() che può essere utilizzato dopo la conversione in stream.
List<Integer> result = list.stream().parallel()
.map(num -> ++num)
.toList();
La differenza è che parallelStream() crea direttamente uno stream parallelo dalla collezione, mentre parallel() converte uno stream seriale esistente in uno stream parallelo.
E soprattutto, noi come programmatori non dobbiamo fare altro che sostituire il metodo stream() con parallelStream(). La Stream API si occupa di tutto e ottimizza il nostro programma!
Esempio: Elaborazione di una Lista di Numeri
Supponiamo di avere una lista di numeri e di voler trovare la somma dei quadrati di tutti i numeri nella lista.
Main.java
123456789101112131415161718192021222324252627package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of integers List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // Sequential stream to sum the squares of numbers int sumSequential = numbers.stream() // Create a sequential stream from the list .mapToInt(n -> n * n) // Map each number to its square .sum(); // Sum the squares // Print the result of the sequential sum System.out.println("Sum of squares (sequential): " + sumSequential); // Parallel stream to sum the squares of numbers int sumParallel = numbers.parallelStream() // Create a parallel stream from the list .mapToInt(n -> n * n) // Map each number to its square .sum(); // Sum the squares // Print the result of the parallel sum System.out.println("Sum of squares (parallel): " + sumParallel); } }
Come puoi vedere, abbiamo semplicemente sostituito stream() con parallelStream() E BASTA. In questo esempio non ci sarà alcun vantaggio, perché in un ambiente a thread singolo un array di 10 caratteri verrà eseguito più velocemente. Questo perché nell'implementazione della Stream API vengono eseguite molte operazioni per distribuire il compito tra i thread.
Stream API decide autonomamente quante thread utilizzare per questo compito, in modo da essere il più efficiente possibile.
Come funziona internamente:
1. Creazione di uno stream parallelo: Quando si chiama parallelStream(), Java crea uno stream parallelo basato sulla sorgente dati originale;
2. Utilizzo di ForkJoinPool (che verrà approfondito successivamente): Gli stream paralleli utilizzano un thread pool comune, ForkJoinPool.commonPool(), che gestisce un gruppo di thread di lavoro;
3. Suddivisione: I dati in un thread parallelo vengono suddivisi in parti utilizzando l'interfaccia Spliterator;
4. Elaborazione: Ogni thread di lavoro in ForkJoinPool elabora la propria parte di dati;
5. Fusione: Dopo l'elaborazione dei dati, i thread di lavoro uniscono i risultati.
Vantaggi degli Stream Paralleli
Prestazioni aumentate è uno dei principali benefici dei thread paralleli, poiché consentono la distribuzione dei compiti su più thread, risultando in un'elaborazione più rapida su processori multi-core.
Inoltre, la semplicità d'uso dell'API dei thread paralleli ne facilita l'integrazione nel codice esistente, eliminando la necessità di una gestione complessa dei thread.
Infine, la scalabilità rappresenta un vantaggio significativo, poiché i thread paralleli si adattano automaticamente al numero di core del processore disponibili, ottimizzando l'esecuzione dei compiti in modo efficiente.
1. Quale classe viene utilizzata dai thread paralleli per controllare i thread?
2. Quale metodo viene utilizzato per creare uno stream parallelo?
3. Cosa fa l'interfaccia Spliterator nel contesto degli stream paralleli?
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Can you explain when it's best to use parallel streams versus regular streams?
What are some potential drawbacks or risks of using parallel streams?
Can you provide more examples of using parallel streams in Java?
Awesome!
Completion rate improved to 3.33
API Stream Paralleli
Scorri per mostrare il menu
Probabilmente hai già familiarità con la Stream API, i suoi metodi e il suo funzionamento (In caso contrario, studia prima questo argomento e poi torna a questo capitolo).
Un flusso di dati regolare non è parallelo, cioè, per quanto possa essere comodo ed elegante nel codice, utilizzare la Stream API senza il metodo parallelStream() su grandi quantità di dati può influire notevolmente sulle prestazioni.
Esiste anche un metodo parallel() che può essere utilizzato dopo la conversione in stream.
List<Integer> result = list.stream().parallel()
.map(num -> ++num)
.toList();
La differenza è che parallelStream() crea direttamente uno stream parallelo dalla collezione, mentre parallel() converte uno stream seriale esistente in uno stream parallelo.
E soprattutto, noi come programmatori non dobbiamo fare altro che sostituire il metodo stream() con parallelStream(). La Stream API si occupa di tutto e ottimizza il nostro programma!
Esempio: Elaborazione di una Lista di Numeri
Supponiamo di avere una lista di numeri e di voler trovare la somma dei quadrati di tutti i numeri nella lista.
Main.java
123456789101112131415161718192021222324252627package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of integers List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // Sequential stream to sum the squares of numbers int sumSequential = numbers.stream() // Create a sequential stream from the list .mapToInt(n -> n * n) // Map each number to its square .sum(); // Sum the squares // Print the result of the sequential sum System.out.println("Sum of squares (sequential): " + sumSequential); // Parallel stream to sum the squares of numbers int sumParallel = numbers.parallelStream() // Create a parallel stream from the list .mapToInt(n -> n * n) // Map each number to its square .sum(); // Sum the squares // Print the result of the parallel sum System.out.println("Sum of squares (parallel): " + sumParallel); } }
Come puoi vedere, abbiamo semplicemente sostituito stream() con parallelStream() E BASTA. In questo esempio non ci sarà alcun vantaggio, perché in un ambiente a thread singolo un array di 10 caratteri verrà eseguito più velocemente. Questo perché nell'implementazione della Stream API vengono eseguite molte operazioni per distribuire il compito tra i thread.
Stream API decide autonomamente quante thread utilizzare per questo compito, in modo da essere il più efficiente possibile.
Come funziona internamente:
1. Creazione di uno stream parallelo: Quando si chiama parallelStream(), Java crea uno stream parallelo basato sulla sorgente dati originale;
2. Utilizzo di ForkJoinPool (che verrà approfondito successivamente): Gli stream paralleli utilizzano un thread pool comune, ForkJoinPool.commonPool(), che gestisce un gruppo di thread di lavoro;
3. Suddivisione: I dati in un thread parallelo vengono suddivisi in parti utilizzando l'interfaccia Spliterator;
4. Elaborazione: Ogni thread di lavoro in ForkJoinPool elabora la propria parte di dati;
5. Fusione: Dopo l'elaborazione dei dati, i thread di lavoro uniscono i risultati.
Vantaggi degli Stream Paralleli
Prestazioni aumentate è uno dei principali benefici dei thread paralleli, poiché consentono la distribuzione dei compiti su più thread, risultando in un'elaborazione più rapida su processori multi-core.
Inoltre, la semplicità d'uso dell'API dei thread paralleli ne facilita l'integrazione nel codice esistente, eliminando la necessità di una gestione complessa dei thread.
Infine, la scalabilità rappresenta un vantaggio significativo, poiché i thread paralleli si adattano automaticamente al numero di core del processore disponibili, ottimizzando l'esecuzione dei compiti in modo efficiente.
1. Quale classe viene utilizzata dai thread paralleli per controllare i thread?
2. Quale metodo viene utilizzato per creare uno stream parallelo?
3. Cosa fa l'interfaccia Spliterator nel contesto degli stream paralleli?
Grazie per i tuoi commenti!