Parallel Stream-API
Du er sannsynligvis allerede kjent med Stream API, dets metoder og hvordan det fungerer (Hvis ikke, studer dette emnet og kom deretter tilbake til dette kapittelet).
En vanlig datastrøm er ikke parallell, det vil si at uansett hvor praktisk og elegant det kan være i koden, kan bruk av Stream API uten å bruke parallelStream()-metoden, med store datamengder, ha stor negativ innvirkning på ytelsen.
Det finnes også en parallel() metode som kan brukes etter konvertering til stream.
List<Integer> result = list.stream().parallel()
.map(num -> ++num)
.toList();
Forskjellen er at parallelStream() oppretter en parallell strøm direkte fra samlingen, mens parallel() konverterer en eksisterende sekvensiell strøm til en parallell strøm.
Og viktigst av alt, vi som programmerere trenger ikke å gjøre noe annet enn å endre stream()-metoden til parallelStream(). Stream API gjør alt selv og optimaliserer programmet vårt!
Eksempel: Behandling av en liste med tall
Anta at vi har en liste med tall og ønsker å finne summen av kvadrater for alle tallene i listen.
Main.java
123456789101112131415161718192021222324252627package 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 ser har vi bare erstattet stream() med parallelStream() OG DET ER ALT. I dette eksemplet vil det ikke gi noen ytelsesgevinst, fordi i et enkelttrådet miljø vil et array med 10 tegn kjøres raskere. Dette skyldes at implementasjonen av Stream API utfører mange handlinger for å fordele oppgaven mellom trådene.
Stream API bestemmer også selv hvor mange tråder den vil bruke for denne oppgaven, slik at det blir så effektivt som mulig.
Hvordan det fungerer under panseret:
1. Opprette en parallell strøm: Når du kaller parallelStream(), oppretter Java en parallell strøm basert på den opprinnelige datakilden;
2. Bruk av ForkJoinPool (vi ser nærmere på dette senere): Parallellstrømmer bruker en felles trådpool, ForkJoinPool.commonPool(), som administrerer en gruppe arbeidstråder;
3. Splitting: Data i en parallell tråd deles opp i deler ved hjelp av Spliterator-grensesnittet;
4. Prosessering: Hver arbeidstråd i ForkJoinPool behandler sin del av dataene;
5. Sammenslåing: Etter at dataene er behandlet, slår arbeidstrådene sammen resultatene.
Fordeler med parallellstrømmer
Økt ytelse er en av de viktigste fordelene med parallelltråder, da de muliggjør fordeling av oppgaver på flere tråder, noe som gir raskere prosessering på flerkjerneprosessorer.
I tillegg gjør brukervennligheten til parallelltråder-API det enkelt å integrere i eksisterende kode, uten behov for kompleks trådhåndtering.
Videre er skalerbarhet en betydelig fordel, ettersom parallelltråder automatisk tilpasser seg antall tilgjengelige prosessorkjerner og optimaliserer oppgaveutførelsen effektivt.
1. Hvilken klasse brukes av parallelle tråder for å kontrollere tråder?
2. Hvilken metode brukes for å opprette en parallell strøm?
3. Hva gjør Spliterator-grensesnittet i konteksten av parallelle strømmer?
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
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
Parallel Stream-API
Sveip for å vise menyen
Du er sannsynligvis allerede kjent med Stream API, dets metoder og hvordan det fungerer (Hvis ikke, studer dette emnet og kom deretter tilbake til dette kapittelet).
En vanlig datastrøm er ikke parallell, det vil si at uansett hvor praktisk og elegant det kan være i koden, kan bruk av Stream API uten å bruke parallelStream()-metoden, med store datamengder, ha stor negativ innvirkning på ytelsen.
Det finnes også en parallel() metode som kan brukes etter konvertering til stream.
List<Integer> result = list.stream().parallel()
.map(num -> ++num)
.toList();
Forskjellen er at parallelStream() oppretter en parallell strøm direkte fra samlingen, mens parallel() konverterer en eksisterende sekvensiell strøm til en parallell strøm.
Og viktigst av alt, vi som programmerere trenger ikke å gjøre noe annet enn å endre stream()-metoden til parallelStream(). Stream API gjør alt selv og optimaliserer programmet vårt!
Eksempel: Behandling av en liste med tall
Anta at vi har en liste med tall og ønsker å finne summen av kvadrater for alle tallene i listen.
Main.java
123456789101112131415161718192021222324252627package 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 ser har vi bare erstattet stream() med parallelStream() OG DET ER ALT. I dette eksemplet vil det ikke gi noen ytelsesgevinst, fordi i et enkelttrådet miljø vil et array med 10 tegn kjøres raskere. Dette skyldes at implementasjonen av Stream API utfører mange handlinger for å fordele oppgaven mellom trådene.
Stream API bestemmer også selv hvor mange tråder den vil bruke for denne oppgaven, slik at det blir så effektivt som mulig.
Hvordan det fungerer under panseret:
1. Opprette en parallell strøm: Når du kaller parallelStream(), oppretter Java en parallell strøm basert på den opprinnelige datakilden;
2. Bruk av ForkJoinPool (vi ser nærmere på dette senere): Parallellstrømmer bruker en felles trådpool, ForkJoinPool.commonPool(), som administrerer en gruppe arbeidstråder;
3. Splitting: Data i en parallell tråd deles opp i deler ved hjelp av Spliterator-grensesnittet;
4. Prosessering: Hver arbeidstråd i ForkJoinPool behandler sin del av dataene;
5. Sammenslåing: Etter at dataene er behandlet, slår arbeidstrådene sammen resultatene.
Fordeler med parallellstrømmer
Økt ytelse er en av de viktigste fordelene med parallelltråder, da de muliggjør fordeling av oppgaver på flere tråder, noe som gir raskere prosessering på flerkjerneprosessorer.
I tillegg gjør brukervennligheten til parallelltråder-API det enkelt å integrere i eksisterende kode, uten behov for kompleks trådhåndtering.
Videre er skalerbarhet en betydelig fordel, ettersom parallelltråder automatisk tilpasser seg antall tilgjengelige prosessorkjerner og optimaliserer oppgaveutførelsen effektivt.
1. Hvilken klasse brukes av parallelle tråder for å kontrollere tråder?
2. Hvilken metode brukes for å opprette en parallell strøm?
3. Hva gjør Spliterator-grensesnittet i konteksten av parallelle strømmer?
Takk for tilbakemeldingene dine!