Parallel-Stream-API
Sie sind wahrscheinlich bereits mit der Stream API, ihren Methoden und ihrer Funktionsweise vertraut (falls nicht, bearbeiten Sie dieses Thema und kehren Sie dann zu diesem Kapitel zurück).
Ein gewöhnlicher Datenstrom ist nicht parallel, das heißt, so bequem und elegant er im Code auch sein mag, kann die Verwendung der Stream API ohne die Methode parallelStream() bei einer großen Datenmenge die Leistung erheblich beeinträchtigen.
Es gibt auch eine Methode parallel(), die nach der Umwandlung in einen Stream verwendet werden kann.
List<Integer> result = list.stream().parallel()
.map(num -> ++num)
.toList();
Der Unterschied besteht darin, dass parallelStream() direkt aus der Collection einen parallelen Stream erstellt, während parallel() einen bestehenden seriellen Stream in einen parallelen Stream umwandelt.
Und vor allem müssen wir als Programmierer nichts weiter tun, als die Methode stream() durch parallelStream() zu ersetzen. Die Stream API übernimmt alles selbst und optimiert unser Programm!
Beispiel: Verarbeitung einer Liste von Zahlen
Angenommen, es gibt eine Liste von Zahlen und das Ziel ist, die Summe der Quadrate aller Zahlen in der Liste zu berechnen.
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); } }
Wie zu sehen ist, wurde lediglich stream() durch parallelStream() ersetzt UND DAS IST ALLES. In diesem Beispiel bringt dies jedoch keinen Vorteil, da in einer Einzel-Thread-Umgebung ein Array mit 10 Zeichen schneller ausgeführt wird. Denn in der Implementierung der Stream API werden viele Aktionen durchgeführt, um die Aufgabe auf verschiedene Threads zu verteilen.
Stream-API entscheidet ebenfalls selbst, wie viele Threads für diese Aufgabe verwendet werden, um eine möglichst effiziente Ausführung zu gewährleisten.
Funktionsweise im Hintergrund:
1. Erstellen eines parallelen Streams: Beim Aufruf von parallelStream() erstellt Java einen parallelen Stream basierend auf der ursprünglichen Datenquelle;
2. Verwendung von ForkJoinPool (wird später behandelt): Parallele Streams nutzen einen gemeinsamen Thread-Pool, ForkJoinPool.commonPool(), der eine Gruppe von Worker-Threads verwaltet;
3. Aufteilung: Daten in einem parallelen Thread werden mithilfe des Spliterator-Interfaces in Teile aufgeteilt;
4. Verarbeitung: Jeder Worker-Thread im ForkJoinPool verarbeitet seinen eigenen Datenteil;
5. Zusammenführung: Nach der Verarbeitung der Daten führen die Worker-Threads die Ergebnisse zusammen.
Vorteile von parallelen Streams
Erhöhte Leistung ist einer der wichtigsten Vorteile von parallelen Threads, da sie die Aufgabenverteilung auf mehrere Threads ermöglichen und so eine schnellere Verarbeitung auf Mehrkernprozessoren erzielen.
Darüber hinaus sorgt die einfache Nutzung der parallelen Threads-API für eine unkomplizierte Integration in bestehenden Code, wodurch komplexes Thread-Management entfällt.
Außerdem ist die Skalierbarkeit ein bedeutender Vorteil, da parallele Threads sich automatisch an die Anzahl der verfügbaren Prozessorkerne anpassen und die Ausführung der Aufgaben effizient optimieren.
1. Welche Klasse wird von parallelen Threads zur Steuerung der Threads verwendet?
2. Welche Methode wird verwendet, um einen parallelen Stream zu erstellen?
3. Welche Funktion erfüllt das Spliterator-Interface im Kontext von parallelen Streams?
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Awesome!
Completion rate improved to 3.33
Parallel-Stream-API
Swipe um das Menü anzuzeigen
Sie sind wahrscheinlich bereits mit der Stream API, ihren Methoden und ihrer Funktionsweise vertraut (falls nicht, bearbeiten Sie dieses Thema und kehren Sie dann zu diesem Kapitel zurück).
Ein gewöhnlicher Datenstrom ist nicht parallel, das heißt, so bequem und elegant er im Code auch sein mag, kann die Verwendung der Stream API ohne die Methode parallelStream() bei einer großen Datenmenge die Leistung erheblich beeinträchtigen.
Es gibt auch eine Methode parallel(), die nach der Umwandlung in einen Stream verwendet werden kann.
List<Integer> result = list.stream().parallel()
.map(num -> ++num)
.toList();
Der Unterschied besteht darin, dass parallelStream() direkt aus der Collection einen parallelen Stream erstellt, während parallel() einen bestehenden seriellen Stream in einen parallelen Stream umwandelt.
Und vor allem müssen wir als Programmierer nichts weiter tun, als die Methode stream() durch parallelStream() zu ersetzen. Die Stream API übernimmt alles selbst und optimiert unser Programm!
Beispiel: Verarbeitung einer Liste von Zahlen
Angenommen, es gibt eine Liste von Zahlen und das Ziel ist, die Summe der Quadrate aller Zahlen in der Liste zu berechnen.
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); } }
Wie zu sehen ist, wurde lediglich stream() durch parallelStream() ersetzt UND DAS IST ALLES. In diesem Beispiel bringt dies jedoch keinen Vorteil, da in einer Einzel-Thread-Umgebung ein Array mit 10 Zeichen schneller ausgeführt wird. Denn in der Implementierung der Stream API werden viele Aktionen durchgeführt, um die Aufgabe auf verschiedene Threads zu verteilen.
Stream-API entscheidet ebenfalls selbst, wie viele Threads für diese Aufgabe verwendet werden, um eine möglichst effiziente Ausführung zu gewährleisten.
Funktionsweise im Hintergrund:
1. Erstellen eines parallelen Streams: Beim Aufruf von parallelStream() erstellt Java einen parallelen Stream basierend auf der ursprünglichen Datenquelle;
2. Verwendung von ForkJoinPool (wird später behandelt): Parallele Streams nutzen einen gemeinsamen Thread-Pool, ForkJoinPool.commonPool(), der eine Gruppe von Worker-Threads verwaltet;
3. Aufteilung: Daten in einem parallelen Thread werden mithilfe des Spliterator-Interfaces in Teile aufgeteilt;
4. Verarbeitung: Jeder Worker-Thread im ForkJoinPool verarbeitet seinen eigenen Datenteil;
5. Zusammenführung: Nach der Verarbeitung der Daten führen die Worker-Threads die Ergebnisse zusammen.
Vorteile von parallelen Streams
Erhöhte Leistung ist einer der wichtigsten Vorteile von parallelen Threads, da sie die Aufgabenverteilung auf mehrere Threads ermöglichen und so eine schnellere Verarbeitung auf Mehrkernprozessoren erzielen.
Darüber hinaus sorgt die einfache Nutzung der parallelen Threads-API für eine unkomplizierte Integration in bestehenden Code, wodurch komplexes Thread-Management entfällt.
Außerdem ist die Skalierbarkeit ein bedeutender Vorteil, da parallele Threads sich automatisch an die Anzahl der verfügbaren Prozessorkerne anpassen und die Ausführung der Aufgaben effizient optimieren.
1. Welche Klasse wird von parallelen Threads zur Steuerung der Threads verwendet?
2. Welche Methode wird verwendet, um einen parallelen Stream zu erstellen?
3. Welche Funktion erfüllt das Spliterator-Interface im Kontext von parallelen Streams?
Danke für Ihr Feedback!