Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Parallel Stream API | Synchronisierte Sammlungen
Multithreading in Java
course content

Kursinhalt

Multithreading in Java

Multithreading in Java

1. Grundlagen der Multithread-Verarbeitung
2. Synchronisierte Sammlungen
3. Hochrangige Synchronisationsmechanismen
4. Best Practices für Multithreading

book
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 in parallelStream() 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.

java

Main

copy
123456789101112131415161718192021222324252627
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?

Welche Klasse wird von parallelen Threads verwendet, um Threads zu steuern?

Welche Klasse wird von parallelen Threads verwendet, um Threads zu steuern?

Wählen Sie die richtige Antwort aus

Welche Methode wird verwendet, um einen parallelen Stream zu erstellen?

Welche Methode wird verwendet, um einen parallelen Stream zu erstellen?

Wählen Sie die richtige Antwort aus

Was macht das Spliterator-Interface im Kontext von parallelen Streams?

Was macht das Spliterator-Interface im Kontext von parallelen Streams?

Wählen Sie die richtige Antwort aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 2
We're sorry to hear that something went wrong. What happened?
some-alt