Java Academy · Lektion

Oprettelse af parallelle streams

parallel() og parallelStream()

Lektion 1 af 413 trin

Oprettelse af parallelle streams er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Sådan fungerer parallelle streams

En parallel stream opdeler sine data og behandler delene på flere tråde, hvorefter resultaterne kombineres. Målet er højere gennemløb ved store arbejdsbelastninger.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int sum = IntStream.rangeClosed(1, 1000)
            .parallel()
            .sum();
        System.out.println(sum);
    }
}

parallel() på en eksisterende stream

Et kald til parallel() omdanner en sekventiel stream til en parallel stream. Det kan placeres hvor som helst i behandlingskæden.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> nums = List.of(1, 2, 3, 4, 5);
        int total = nums.stream()
            .parallel()
            .mapToInt(Integer::intValue)
            .sum();
        System.out.println(total);
    }
}

parallelStream() på samlinger

Collection.parallelStream() opretter en parallel stream direkte og er en genvej til stream().parallel().

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> words = List.of("a", "bb", "ccc");
        int chars = words.parallelStream()
            .mapToInt(String::length)
            .sum();
        System.out.println(chars);
    }
}

Tilbage til sekventiel behandling

sequential() skifter en stream tilbage til udførelse med én tråd. Det seneste kald til parallel() eller sequential() gælder for hele behandlingskæden.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int sum = IntStream.rangeClosed(1, 100)
            .parallel()
            .sequential()
            .sum();
        System.out.println(sum);
    }
}

Kontrol af isParallel

isParallel() angiver, om en stream vil blive udført parallelt.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        System.out.println(IntStream.range(0, 10).isParallel());
        System.out.println(IntStream.range(0, 10).parallel().isParallel());
    }
}

Samme resultat, forskellig udførelse

For associative operationer som sum returnerer parallelle og sekventielle streams det samme resultat. Kun udførelsesstrategien er forskellig.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int seq = IntStream.rangeClosed(1, 50).sum();
        int par = IntStream.rangeClosed(1, 50).parallel().sum();
        System.out.println(seq == par);
    }
}

Den fælles ForkJoinPool

Parallelle streams bruger den delte ForkJoinPool.commonPool(). Standardstørrelsen er antallet af tilgængelige processorer minus én.

public class Main {
    public static void main(String[] args) {
        System.out.println(Runtime.getRuntime().availableProcessors());
    }
}

Trådenes rækkefølge er ikke garanteret

Med forEach kan parallelle streams udskrive i vilkårlig rækkefølge, fordi delene afsluttes på forskellige tidspunkter. Brug forEachOrdered, hvis rækkefølgen er vigtig.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntStream.rangeClosed(1, 5)
            .parallel()
            .forEachOrdered(System.out::println);
    }
}

Reduktion kombinerer delresultater

Under overfladen beregner en parallel reduktion delresultater for hver del og fletter dem med kombineringsfunktionen. Operationen skal være associativ for at være korrekt.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int product = IntStream.rangeClosed(1, 6)
            .parallel()
            .reduce(1, (a, b) -> a * b);
        System.out.println(product);
    }
}

Indsamling parallelt

Indsamlingsrammeværket understøtter parallel indsamling ved at flette delvise beholdere. groupingBy fungerer korrekt parallelt.

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> words = List.of("apple", "banana", "avocado", "cherry");
        Map<Character, List<String>> byFirst = words.parallelStream()
            .collect(Collectors.groupingBy(w -> w.charAt(0)));
        System.out.println(byFirst);
    }
}

Ikke alle streams bliver hurtigere

Det er enkelt at aktivere parallelitet, men det er ikke altid en fordel. Små datamængder eller billige operationer kan være langsommere parallelt på grund af ekstraomkostningerne ved opdeling og sammenfletning.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        long count = IntStream.rangeClosed(1, 10)
            .parallel()
            .filter(n -> n % 2 == 0)
            .count();
        System.out.println(count);
    }
}

Hurtigt tjek

Hvilken trådpulje udfører parallelle streams som standard?

Opsummering

Du har oprettet parallelle streams:

  • parallel() omdanner enhver stream; parallelStream() er en genvej til samlinger.
  • sequential() skifter tilbage; det seneste kald gælder.
  • De kører på den delte ForkJoinPool.commonPool().
  • Resultaterne svarer til sekventielle resultater for associative operationer, men rækkefølge og hastighed er ikke garanteret.
Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “Oprettelse af parallelle streams” gratis?

Ja — hele teksten til “Oprettelse af parallelle streams” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Oprettelse af parallelle streams”?

parallel() og parallelStream() Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Oprettelse af parallelle streams”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Oprettelse af parallelle streams
  2. Hvornår parallelitet hjælper
  3. Trådsikkerhed og sideeffekter
  4. Almindelige faldgruber
← Tilbage til Java Academy