Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Parallel Stream-API | Synchroniserede Samlinger
Multitrådning i Java

bookParallel Stream-API

Du er sandsynligvis allerede bekendt med Stream API, dets metoder og hvordan det fungerer (Hvis ikke, gennemgå dette emne og vend derefter tilbage til dette kapitel).

En almindelig datastream er ikke parallel, det vil sige, uanset hvor bekvem og elegant den måtte være i koden, kan brug af Stream API uden at anvende parallelStream()-metoden, ved store datamængder, have en betydelig negativ indvirkning på ydeevnen.

Der findes også en parallel() metode, som kan anvendes efter konvertering til stream.

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

Forskellen er, at parallelStream() opretter en parallel stream direkte fra samlingen, mens parallel() konverterer en eksisterende seriel stream til en parallel stream.

Note
Bemærk

Og vigtigst af alt, som programmører behøver vi ikke gøre andet end at ændre stream()-metoden til parallelStream(). Stream API håndterer alt selv og optimerer vores program!

Eksempel: Behandling af en liste med tal

Antag, at vi har en liste med tal, og vi ønsker at finde summen af kvadraterne af alle tallene i listen.

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

Som du kan se, har vi blot erstattet stream() med parallelStream() OG DET ER DET HELE. I dette eksempel vil det ikke give nogen fordel, fordi et array med 10 tegn vil blive udført hurtigere i et enkelttrådet miljø. Dette skyldes, at implementeringen af Stream API udfører mange handlinger for at fordele opgaven mellem tråde.

Note
Bemærk

Stream API bestemmer også selv, hvor mange tråde den vil bruge til denne opgave, så det bliver så effektivt som muligt.

Sådan fungerer det under motorhjelmen:

1. Oprettelse af en parallel stream: Når du kalder parallelStream(), opretter Java en parallel stream baseret på den oprindelige datakilde;

2. Brug af ForkJoinPool (vi ser nærmere på dette senere): Parallelle streams anvender en fælles tråd-pool, ForkJoinPool.commonPool(), som administrerer en gruppe af arbejdstråde;

3. Opdeling: Data i en parallel tråd opdeles i dele ved hjælp af Spliterator-interfacet;

4. Behandling: Hver arbejdståd i ForkJoinPool behandler sin del af dataene;

5. Sammenfletning: Efter behandlingen af dataene sammenfletter arbejdstådene resultaterne.

Fordele ved parallelle streams

Øget ydeevne er en af de vigtigste fordele ved parallelle tråde, da de muliggør opgavefordeling på tværs af flere tråde, hvilket resulterer i hurtigere behandling på multi-core processorer.

Derudover gør den brugervenlige parallelle tråde API det nemt at integrere i eksisterende kode, hvilket eliminerer behovet for kompleks trådhåndtering.

Endvidere er skalerbarhed en væsentlig fordel, da parallelle tråde automatisk tilpasser sig antallet af tilgængelige processorkerner og optimerer opgaveudførelsen effektivt.

1. Hvilken klasse bruges af parallelle tråde til at kontrollere tråde?

2. Hvilken metode bruges til at oprette en parallel stream?

3. Hvad gør Spliterator-interfacet i forbindelse med parallelle streams?

question mark

Hvilken klasse bruges af parallelle tråde til at kontrollere tråde?

Select the correct answer

question mark

Hvilken metode bruges til at oprette en parallel stream?

Select the correct answer

question mark

Hvad gør Spliterator-interfacet i forbindelse med parallelle streams?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 2

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

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

bookParallel Stream-API

Stryg for at vise menuen

Du er sandsynligvis allerede bekendt med Stream API, dets metoder og hvordan det fungerer (Hvis ikke, gennemgå dette emne og vend derefter tilbage til dette kapitel).

En almindelig datastream er ikke parallel, det vil sige, uanset hvor bekvem og elegant den måtte være i koden, kan brug af Stream API uden at anvende parallelStream()-metoden, ved store datamængder, have en betydelig negativ indvirkning på ydeevnen.

Der findes også en parallel() metode, som kan anvendes efter konvertering til stream.

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

Forskellen er, at parallelStream() opretter en parallel stream direkte fra samlingen, mens parallel() konverterer en eksisterende seriel stream til en parallel stream.

Note
Bemærk

Og vigtigst af alt, som programmører behøver vi ikke gøre andet end at ændre stream()-metoden til parallelStream(). Stream API håndterer alt selv og optimerer vores program!

Eksempel: Behandling af en liste med tal

Antag, at vi har en liste med tal, og vi ønsker at finde summen af kvadraterne af alle tallene i listen.

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

Som du kan se, har vi blot erstattet stream() med parallelStream() OG DET ER DET HELE. I dette eksempel vil det ikke give nogen fordel, fordi et array med 10 tegn vil blive udført hurtigere i et enkelttrådet miljø. Dette skyldes, at implementeringen af Stream API udfører mange handlinger for at fordele opgaven mellem tråde.

Note
Bemærk

Stream API bestemmer også selv, hvor mange tråde den vil bruge til denne opgave, så det bliver så effektivt som muligt.

Sådan fungerer det under motorhjelmen:

1. Oprettelse af en parallel stream: Når du kalder parallelStream(), opretter Java en parallel stream baseret på den oprindelige datakilde;

2. Brug af ForkJoinPool (vi ser nærmere på dette senere): Parallelle streams anvender en fælles tråd-pool, ForkJoinPool.commonPool(), som administrerer en gruppe af arbejdstråde;

3. Opdeling: Data i en parallel tråd opdeles i dele ved hjælp af Spliterator-interfacet;

4. Behandling: Hver arbejdståd i ForkJoinPool behandler sin del af dataene;

5. Sammenfletning: Efter behandlingen af dataene sammenfletter arbejdstådene resultaterne.

Fordele ved parallelle streams

Øget ydeevne er en af de vigtigste fordele ved parallelle tråde, da de muliggør opgavefordeling på tværs af flere tråde, hvilket resulterer i hurtigere behandling på multi-core processorer.

Derudover gør den brugervenlige parallelle tråde API det nemt at integrere i eksisterende kode, hvilket eliminerer behovet for kompleks trådhåndtering.

Endvidere er skalerbarhed en væsentlig fordel, da parallelle tråde automatisk tilpasser sig antallet af tilgængelige processorkerner og optimerer opgaveudførelsen effektivt.

1. Hvilken klasse bruges af parallelle tråde til at kontrollere tråde?

2. Hvilken metode bruges til at oprette en parallel stream?

3. Hvad gør Spliterator-interfacet i forbindelse med parallelle streams?

question mark

Hvilken klasse bruges af parallelle tråde til at kontrollere tråde?

Select the correct answer

question mark

Hvilken metode bruges til at oprette en parallel stream?

Select the correct answer

question mark

Hvad gør Spliterator-interfacet i forbindelse med parallelle streams?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 2
some-alt