Kursinhalt
Multithreading in Java
Multithreading in Java
Parallel Stream API
Sie sind wahrscheinlich bereits mit der Stream API
, ihren Methoden und ihrer Funktionsweise vertraut (falls nicht, studieren Sie dieses Thema und kehren Sie dann zu diesem Kapitel zurück).
Ein regulärer Datenstrom ist nicht parallel, das heißt, egal wie praktisch und schön er im Code sein mag, die Verwendung der Stream API ohne die Verwendung der parallelStream()
-Methode kann bei einer großen Datenmenge die Leistung erheblich beeinträchtigen.
Es gibt auch eine parallel()
Methode, die nach der Umwandlung in einen Stream verwendet werden kann.
Der Unterschied besteht darin, dass parallelStream()
direkt einen parallelen Stream aus der Sammlung erstellt, während parallel()
einen vorhandenen seriellen Stream in einen parallelen Stream umwandelt.
Hinweis
Und vor allem müssen wir als Programmierer nichts weiter tun, als die
stream()
-Methode inparallelStream()
zu ändern. Die Stream-API erledigt alles von selbst und optimiert unser Programm!
Beispiel: Verarbeitung einer Liste von Zahlen
Angenommen, wir haben eine Liste von Zahlen und möchten die Summe der Quadrate aller Zahlen in der Liste finden.
Main
package 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 Sie sehen, haben wir einfach stream()
durch parallelStream()
ersetzt UND DAS IST ALLES. In diesem Beispiel wird es keinen Gewinn bringen, da in einer einsträngigen Umgebung ein Array von 10 Zeichen schneller ausgeführt wird. Denn in der Implementierung der Stream API werden viele Aktionen durchgeführt, um die Aufgabe zwischen den Threads zu verteilen.
Hinweis
Die Stream API entscheidet auch selbst, wie viele Threads sie für diese Aufgabe verwenden wird, damit sie so effizient wie möglich ist.
Wie es unter der Haube funktioniert:
1. Erstellen eines parallelen Streams: Wenn Sie parallelStream()
aufrufen, erstellt Java einen parallelen Stream basierend auf der ursprünglichen Datenquelle;
2. Verwendung von ForkJoinPool (wir werden später darauf eingehen): Parallele Streams verwenden einen gemeinsamen Thread-Pool, ForkJoinPool.commonPool()
, der eine Gruppe von Worker-Threads verwaltet;
3. Aufteilen: Daten in einem parallelen Thread werden mithilfe der Spliterator
-Schnittstelle in Teile aufgeteilt;
4. Verarbeitung: Jeder Worker-Thread im ForkJoinPool
verarbeitet seinen Teil der Daten;
5. Zusammenführen: Nach der Verarbeitung der Daten führen die Worker-Threads die Ergebnisse zusammen.
Vorteile von parallelen Streams
Erhöhte Leistung ist einer der Hauptvorteile von parallelen Threads, da sie die Aufgabenverteilung auf mehrere Threads ermöglichen, was zu einer schnelleren Verarbeitung auf Mehrkernprozessoren führt.
Darüber hinaus macht die Benutzerfreundlichkeit der parallelen Threads API die Integration in bestehenden Code einfach und eliminiert die Notwendigkeit für komplexes Thread-Management.
Außerdem ist die Skalierbarkeit ein bedeutender Vorteil, da parallele Threads sich automatisch an die Anzahl der verfügbaren Prozessorkerne anpassen und die Aufgabenausführung effizient optimieren.
1. Welche Klasse wird von parallelen Threads verwendet, um Threads zu steuern?
2. Welche Methode wird verwendet, um einen parallelen Stream zu erstellen?
3. Was macht das Spliterator-Interface im Kontext von parallelen Streams?
Danke für Ihr Feedback!