Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Parallel Stream-API | Synkroniserade Samlingar
Quizzes & Challenges
Quizzes
Challenges
/
Multitrådning i Java

bookParallel Stream-API

Du är förmodligen redan bekant med Stream API, dess metoder och hur det fungerar (Om inte, studera detta ämne och återkom sedan till detta kapitel).

Ett vanligt datastream är inte parallellt, det vill säga, oavsett hur bekvämt och snyggt det kan vara i koden, kan användning av Stream API utan att använda metoden parallelStream() vid stora datamängder påverka prestandan avsevärt.

Det finns också en metod parallel() som kan användas efter konvertering till stream.

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

Skillnaden är att parallelStream() skapar ett parallellt flöde direkt från samlingen, medan parallel() konverterar ett befintligt sekventiellt flöde till ett parallellt flöde.

Note
Notering

Och framför allt behöver vi som programmerare inte göra något annat än att byta ut metoden stream() mot parallelStream(). Stream API hanterar allt själv och optimerar vårt program!

Exempel: Bearbetning av en lista med tal

Antag att vi har en lista med tal och vi vill hitta summan av kvadraterna av alla tal i listan.

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 bara ersatt stream() med parallelStream() OCH DET ÄR ALLT. I detta exempel ger det ingen prestandaförbättring, eftersom en array med 10 tecken körs snabbare i en enkeltrådad miljö. Detta beror på att implementationen av Stream API utför många åtgärder för att fördela uppgiften mellan trådar.

Note
Notering

Stream API bestämmer också själv hur många trådar som används för denna uppgift, så att det blir så effektivt som möjligt.

Hur det fungerar under huven:

1. Skapa ett parallellt flöde: När parallelStream() anropas, skapar Java ett parallellt flöde baserat på den ursprungliga datakällan;

2. Användning av ForkJoinPool (vi utforskar detta senare): Parallella flöden använder en gemensam trådpool, ForkJoinPool.commonPool(), som hanterar en grupp arbetstrådar;

3. Uppdelning: Data i en parallell tråd delas upp i delar med hjälp av gränssnittet Spliterator;

4. Bearbetning: Varje arbetstråd i ForkJoinPool bearbetar sin del av datan;

5. Sammanfogning: Efter bearbetning av datan sammanfogar arbetstrådarna resultaten.

Fördelar med parallella flöden

Ökad prestanda är en av de viktigaste fördelarna med parallella trådar, eftersom de möjliggör uppdelning av uppgifter över flera trådar, vilket ger snabbare bearbetning på flerkärniga processorer.

Dessutom gör enkelheten i parallella trådars API det lätt att integrera i befintlig kod, utan behov av komplex trådhantering.

Vidare är skalbarhet en betydande fördel, eftersom parallella trådar automatiskt anpassar sig till antalet tillgängliga processorkärnor och optimerar uppgiftskörningen effektivt.

1. Vilken klass används av parallella trådar för att kontrollera trådar?

2. Vilken metod används för att skapa en parallell ström?

3. Vad gör Spliterator-gränssnittet i samband med parallella strömmar?

question mark

Vilken klass används av parallella trådar för att kontrollera trådar?

Select the correct answer

question mark

Vilken metod används för att skapa en parallell ström?

Select the correct answer

question mark

Vad gör Spliterator-gränssnittet i samband med parallella strömmar?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 2

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Awesome!

Completion rate improved to 3.33

bookParallel Stream-API

Svep för att visa menyn

Du är förmodligen redan bekant med Stream API, dess metoder och hur det fungerar (Om inte, studera detta ämne och återkom sedan till detta kapitel).

Ett vanligt datastream är inte parallellt, det vill säga, oavsett hur bekvämt och snyggt det kan vara i koden, kan användning av Stream API utan att använda metoden parallelStream() vid stora datamängder påverka prestandan avsevärt.

Det finns också en metod parallel() som kan användas efter konvertering till stream.

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

Skillnaden är att parallelStream() skapar ett parallellt flöde direkt från samlingen, medan parallel() konverterar ett befintligt sekventiellt flöde till ett parallellt flöde.

Note
Notering

Och framför allt behöver vi som programmerare inte göra något annat än att byta ut metoden stream() mot parallelStream(). Stream API hanterar allt själv och optimerar vårt program!

Exempel: Bearbetning av en lista med tal

Antag att vi har en lista med tal och vi vill hitta summan av kvadraterna av alla tal i listan.

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 bara ersatt stream() med parallelStream() OCH DET ÄR ALLT. I detta exempel ger det ingen prestandaförbättring, eftersom en array med 10 tecken körs snabbare i en enkeltrådad miljö. Detta beror på att implementationen av Stream API utför många åtgärder för att fördela uppgiften mellan trådar.

Note
Notering

Stream API bestämmer också själv hur många trådar som används för denna uppgift, så att det blir så effektivt som möjligt.

Hur det fungerar under huven:

1. Skapa ett parallellt flöde: När parallelStream() anropas, skapar Java ett parallellt flöde baserat på den ursprungliga datakällan;

2. Användning av ForkJoinPool (vi utforskar detta senare): Parallella flöden använder en gemensam trådpool, ForkJoinPool.commonPool(), som hanterar en grupp arbetstrådar;

3. Uppdelning: Data i en parallell tråd delas upp i delar med hjälp av gränssnittet Spliterator;

4. Bearbetning: Varje arbetstråd i ForkJoinPool bearbetar sin del av datan;

5. Sammanfogning: Efter bearbetning av datan sammanfogar arbetstrådarna resultaten.

Fördelar med parallella flöden

Ökad prestanda är en av de viktigaste fördelarna med parallella trådar, eftersom de möjliggör uppdelning av uppgifter över flera trådar, vilket ger snabbare bearbetning på flerkärniga processorer.

Dessutom gör enkelheten i parallella trådars API det lätt att integrera i befintlig kod, utan behov av komplex trådhantering.

Vidare är skalbarhet en betydande fördel, eftersom parallella trådar automatiskt anpassar sig till antalet tillgängliga processorkärnor och optimerar uppgiftskörningen effektivt.

1. Vilken klass används av parallella trådar för att kontrollera trådar?

2. Vilken metod används för att skapa en parallell ström?

3. Vad gör Spliterator-gränssnittet i samband med parallella strömmar?

question mark

Vilken klass används av parallella trådar för att kontrollera trådar?

Select the correct answer

question mark

Vilken metod används för att skapa en parallell ström?

Select the correct answer

question mark

Vad gör Spliterator-gränssnittet i samband med parallella strömmar?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 2
some-alt