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

bookParallel 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.

Note
Merk

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

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 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.

Note
Merk

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?

question mark

Hvilken klasse brukes av parallelle tråder for å kontrollere tråder?

Select the correct answer

question mark

Hvilken metode brukes for å opprette en parallell strøm?

Select the correct answer

question mark

Hva gjør Spliterator-grensesnittet i konteksten av parallelle strømmer?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 2

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

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

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.

Note
Merk

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

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 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.

Note
Merk

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?

question mark

Hvilken klasse brukes av parallelle tråder for å kontrollere tråder?

Select the correct answer

question mark

Hvilken metode brukes for å opprette en parallell strøm?

Select the correct answer

question mark

Hva gjør Spliterator-grensesnittet i konteksten av parallelle strømmer?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 2
some-alt