Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Parallelstream-API | Gesynchroniseerde Collecties
Multithreading in Java

bookParallelstream-API

Je bent waarschijnlijk al bekend met de Stream API, de methoden en hoe deze werkt (Zo niet, bestudeer dan eerst dit onderwerp en kom daarna terug naar dit hoofdstuk).

Een gewone datastroom is niet parallel, dat wil zeggen, hoe handig en elegant het ook in de code is, het gebruik van de Stream API zonder de parallelStream()-methode kan bij grote hoeveelheden data de prestaties aanzienlijk beïnvloeden.

Er is ook een parallel() methode die gebruikt kan worden na de conversie naar een stream.

List<Integer> result = list.stream().parallel()
                .map(num -> ++num)
                .toList();

Het verschil is dat parallelStream() direct een parallelle stream maakt vanuit de collectie, terwijl parallel() een bestaande seriële stream omzet in een parallelle stream.

Note
Opmerking

En het belangrijkste is dat wij als programmeurs niets hoeven te doen behalve de stream()-methode te vervangen door parallelStream(). De Stream API regelt alles zelf en optimaliseert ons programma!

Voorbeeld: Verwerken van een lijst met getallen

Stel, we hebben een lijst met getallen en we willen de som van de kwadraten van alle getallen in de lijst berekenen.

Main.java

Main.java

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); } }

Zoals te zien is, hebben we alleen stream() vervangen door parallelStream() EN DAT IS ALLES. In dit voorbeeld levert dit geen voordeel op, omdat in een single-threaded omgeving een array van 10 tekens sneller wordt uitgevoerd. Dit komt doordat de implementatie van de Stream API veel handelingen uitvoert om de taak over de threads te verdelen.

Note
Opmerking

Stream API bepaalt ook zelf hoeveel threads het zal gebruiken voor deze taak, zodat het zo efficiënt mogelijk is.

Hoe het onder de motorkap werkt:

1. Aanmaken van een parallelle stream: Wanneer parallelStream() wordt aangeroepen, maakt Java een parallelle stream op basis van de oorspronkelijke gegevensbron;

2. Gebruik van ForkJoinPool (later besproken): Parallelle streams maken gebruik van een gemeenschappelijke threadpool, ForkJoinPool.commonPool(), die een groep worker threads beheert;

3. Opsplitsen: Gegevens in een parallelle thread worden verdeeld in delen met behulp van de Spliterator interface;

4. Verwerking: Elke worker thread in de ForkJoinPool verwerkt zijn deel van de gegevens;

5. Samenvoegen: Na de verwerking van de gegevens voegen de worker threads de resultaten samen.

Voordelen van parallelle streams

Verhoogde prestaties is een van de belangrijkste voordelen van parallelle threads, omdat ze taakverdeling over meerdere threads mogelijk maken, wat resulteert in snellere verwerking op multi-core processors.

Daarnaast maakt het gebruiksgemak van de parallelle threads API het eenvoudig te integreren in bestaande code, waardoor complexe thread-beheer overbodig wordt.

Bovendien is schaalbaarheid een belangrijk voordeel, aangezien parallelle threads zich automatisch aanpassen aan het aantal beschikbare processorkernen, waardoor de uitvoering van taken efficiënt wordt geoptimaliseerd.

1. Welke klasse wordt door parallelle threads gebruikt om threads te beheren?

2. Welke methode wordt gebruikt om een parallelle stream te maken?

3. Wat doet de Spliterator-interface in de context van parallelle streams?

question mark

Welke klasse wordt door parallelle threads gebruikt om threads te beheren?

Select the correct answer

question mark

Welke methode wordt gebruikt om een parallelle stream te maken?

Select the correct answer

question mark

Wat doet de Spliterator-interface in de context van parallelle streams?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 2

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Suggested prompts:

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

bookParallelstream-API

Veeg om het menu te tonen

Je bent waarschijnlijk al bekend met de Stream API, de methoden en hoe deze werkt (Zo niet, bestudeer dan eerst dit onderwerp en kom daarna terug naar dit hoofdstuk).

Een gewone datastroom is niet parallel, dat wil zeggen, hoe handig en elegant het ook in de code is, het gebruik van de Stream API zonder de parallelStream()-methode kan bij grote hoeveelheden data de prestaties aanzienlijk beïnvloeden.

Er is ook een parallel() methode die gebruikt kan worden na de conversie naar een stream.

List<Integer> result = list.stream().parallel()
                .map(num -> ++num)
                .toList();

Het verschil is dat parallelStream() direct een parallelle stream maakt vanuit de collectie, terwijl parallel() een bestaande seriële stream omzet in een parallelle stream.

Note
Opmerking

En het belangrijkste is dat wij als programmeurs niets hoeven te doen behalve de stream()-methode te vervangen door parallelStream(). De Stream API regelt alles zelf en optimaliseert ons programma!

Voorbeeld: Verwerken van een lijst met getallen

Stel, we hebben een lijst met getallen en we willen de som van de kwadraten van alle getallen in de lijst berekenen.

Main.java

Main.java

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); } }

Zoals te zien is, hebben we alleen stream() vervangen door parallelStream() EN DAT IS ALLES. In dit voorbeeld levert dit geen voordeel op, omdat in een single-threaded omgeving een array van 10 tekens sneller wordt uitgevoerd. Dit komt doordat de implementatie van de Stream API veel handelingen uitvoert om de taak over de threads te verdelen.

Note
Opmerking

Stream API bepaalt ook zelf hoeveel threads het zal gebruiken voor deze taak, zodat het zo efficiënt mogelijk is.

Hoe het onder de motorkap werkt:

1. Aanmaken van een parallelle stream: Wanneer parallelStream() wordt aangeroepen, maakt Java een parallelle stream op basis van de oorspronkelijke gegevensbron;

2. Gebruik van ForkJoinPool (later besproken): Parallelle streams maken gebruik van een gemeenschappelijke threadpool, ForkJoinPool.commonPool(), die een groep worker threads beheert;

3. Opsplitsen: Gegevens in een parallelle thread worden verdeeld in delen met behulp van de Spliterator interface;

4. Verwerking: Elke worker thread in de ForkJoinPool verwerkt zijn deel van de gegevens;

5. Samenvoegen: Na de verwerking van de gegevens voegen de worker threads de resultaten samen.

Voordelen van parallelle streams

Verhoogde prestaties is een van de belangrijkste voordelen van parallelle threads, omdat ze taakverdeling over meerdere threads mogelijk maken, wat resulteert in snellere verwerking op multi-core processors.

Daarnaast maakt het gebruiksgemak van de parallelle threads API het eenvoudig te integreren in bestaande code, waardoor complexe thread-beheer overbodig wordt.

Bovendien is schaalbaarheid een belangrijk voordeel, aangezien parallelle threads zich automatisch aanpassen aan het aantal beschikbare processorkernen, waardoor de uitvoering van taken efficiënt wordt geoptimaliseerd.

1. Welke klasse wordt door parallelle threads gebruikt om threads te beheren?

2. Welke methode wordt gebruikt om een parallelle stream te maken?

3. Wat doet de Spliterator-interface in de context van parallelle streams?

question mark

Welke klasse wordt door parallelle threads gebruikt om threads te beheren?

Select the correct answer

question mark

Welke methode wordt gebruikt om een parallelle stream te maken?

Select the correct answer

question mark

Wat doet de Spliterator-interface in de context van parallelle streams?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 2
some-alt