Java Academy · Lektion

StructuredTaskScope

Fork og join underopgaver

Lektion 2 af 413 trin

StructuredTaskScope er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 2 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.

Mød StructuredTaskScope

StructuredTaskScope er kerne-API'en i struktureret samtidighed. Du åbner en kontekst, fork underopgaver, kalder join for at vente på dem og læser derefter deres resultater.

Det er en forhåndsvisningsfunktion, så du skal kompilere og køre med --enable-preview.

Den grundlæggende livscyklus

Hver anvendelse følger den samme rytme i fire trin:

  • Åbn konteksten i en try-with-resources-blok
  • fork en eller flere underopgaver, som hver returnerer et Subtask-håndtag
  • Kald join for at vente på, at de bliver færdige
  • Læs hver underopgaves resultat via get()

Fork returnerer et håndtag

fork(Callable) starter straks underopgaven på en virtuel tråd og returnerer en Subtask. Du må ikke kalde dens get(), før join() returnerer.

Et komplet eksempel

Her kører to underopgaver samtidigt. Begge skal være færdige, før du læser resultaterne. Dette bruger ShutdownOnFailure, som er en indbygget politik.

import java.util.concurrent.StructuredTaskScope;

public class Main {
    public static void main(String[] args) throws Exception {
        try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
            var name = scope.fork(() -> "Grace");
            var count = scope.fork(() -> 3);
            scope.join();
            scope.throwIfFailed();
            System.out.println(name.get() + " placed " + count.get() + " orders");
        }
    }
}

Join og læs derefter

Rækkefølgen er fast: fork, then join, then get. Hvis du kalder get() på en underopgave, før join() er færdig, kastes IllegalStateException.

Denne regel er med til at holde levetiden struktureret.

Underopgavernes tilstande

Efter join() rapporterer hver Subtask en state():

  • SUCCESS med et resultat fra get()
  • FAILED med undtagelsen fra exception()
  • UNAVAILABLE, hvis den aldrig blev færdig

Mange underopgaver

Du kan opdele arbejdet i lige så mange underopgaver, som du vil; hver får sin egen virtuelle tråd. Sådan spreder du en gruppe uafhængige kald ud.

import java.util.*;
import java.util.concurrent.StructuredTaskScope;

public class Main {
    public static void main(String[] args) throws Exception {
        try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
            List<StructuredTaskScope.Subtask<Integer>> tasks = new ArrayList<>();
            for (int i = 1; i <= 5; i++) {
                final int n = i;
                tasks.add(scope.fork(() -> n * n));
            }
            scope.join();
            scope.throwIfFailed();
            int total = tasks.stream().mapToInt(StructuredTaskScope.Subtask::get).sum();
            System.out.println("Sum of squares 1..5 = " + total);
        }
    }
}

Konteksten ejer trådene

Konteksten er en AutoCloseable. Når try-blokken slutter, sikrer close(), at alle underopgavernes tråde er afsluttet. Lækager er ikke mulige.

Derfor skal du altid bruge den i en try-with-resources.

Indbyggede politikker

JDK'et leveres med to færdige politikker for afslutning:

  • ShutdownOnFailure: annuller resten, hvis en underopgave mislykkes
  • ShutdownOnSuccess: annuller resten, så snart én underopgave lykkes

Du kan også nedarve fra StructuredTaskScope for at implementere tilpasset logik.

Den samme tråd kalder join

Kun den tråd, der åbnede konteksten, må opdele arbejdet i den og kalde join. Underopgaverne er begrænset til deres ejende kontekst, så træet forbliver korrekt opbygget.

Flag til kompilering og kørsel

Da API'en er en forhåndsvisning, skal du bygge med:

  • javac --release 21 --enable-preview Main.java
  • java --enable-preview Main

Uden flaget får du en kompilerings- eller kørselsfejl.

Hurtigt tjek

Husk den obligatoriske rækkefølge for kald.

Opsamling

Du har lært StructuredTaskScope-API'en:

  • Åbn i try-with-resources, kald fork, join og derefter get
  • Hver underopgave kører på sin egen virtuelle tråd
  • Konteksten garanterer, at alle underopgaver afsluttes, før den lukkes
  • Kræver --enable-preview

Næste emne er politikkerne for afslutning ved fejl og ved succes i detaljer.

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 “StructuredTaskScope” gratis?

Ja — hele teksten til “StructuredTaskScope” 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 “StructuredTaskScope”?

Fork og join underopgaver 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 2 af 4.

Hvor lang tid tager lektionen “StructuredTaskScope”?

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. Modellen for structured concurrency
  2. StructuredTaskScope
  3. Nedlukning ved fejl og succes
  4. Fejlhåndtering og annullering
← Tilbage til Java Academy