StructuredTaskScope
Starta och sammanfoga deluppgifter.
StructuredTaskScope är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.
Möt StructuredTaskScope
StructuredTaskScope är kärn-API:t för strukturerad samtidighet. Ni öppnar ett scope, forkar deluppgifter, joinar för att vänta på dem och läser sedan deras resultat.
Det är en förhandsgranskningsfunktion, så kompilera och kör med --enable-preview.
Den grundläggande livscykeln
Varje användning följer samma rytm i fyra steg:
- Öppna scopet i ett try-with-resources-block
forka en eller flera deluppgifter, där varje uppgift returnerar ettSubtask-handtagjoina för att vänta på att de ska slutföras- Läs resultatet för varje deluppgift via
get()
Fork returnerar ett handtag
fork(Callable) startar omedelbart deluppgiften på en virtuell tråd och returnerar ett Subtask. Ni får inte anropa dess get() förrän join() har returnerat.
Ett komplett exempel
Här körs två deluppgifter samtidigt. Båda måste slutföras innan vi läser resultaten. Exemplet använder ShutdownOnFailure, en inbyggd policy.
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 och läs sedan
Ordningsregeln är strikt: fork, then join, then get. Om ni anropar get() på en deluppgift innan join() är klar kastas IllegalStateException.
Det är denna regel som håller livstiden strukturerad.
Deluppgifternas tillstånd
Efter join() rapporterar varje Subtask ett state():
SUCCESSmed ett resultat frånget()FAILEDmed undantaget frånexception()UNAVAILABLEom den aldrig slutfördes
Många deluppgifter
Ni kan forka så många deluppgifter ni vill; varje deluppgift får en egen virtuell tråd. Det är så ni förgrenar en grupp oberoende anrop.
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);
}
}
}Scopet ansvarar för trådarna
Scopet är ett AutoCloseable. När try-blocket avslutas ser close() till att tråden för varje deluppgift har avslutats. Inga läckor kan uppstå.
Därför använder ni det alltid i ett try-with-resources-block.
Inbyggda policyer
JDK levereras med två färdiga avslutningspolicyer:
ShutdownOnFailure: avbryt resten om någon deluppgift misslyckasShutdownOnSuccess: avbryt resten så snart en deluppgift lyckas
Ni kan också skapa en subklass av StructuredTaskScope för anpassad logik.
Samma tråd joinar
Endast tråden som öppnade scopet får forka deluppgifter i det och anropa join. Deluppgifter är bundna till sitt ägande scope, vilket håller trädet välformat.
Flaggor för kompilering och körning
Eftersom API:t är en förhandsgranskning bygger ni med:
javac --release 21 --enable-preview Main.javajava --enable-preview Main
Utan flaggan får ni ett kompilerings- eller körningsfel.
Snabbtest
Kom ihåg den obligatoriska anropsordningen.
Sammanfattning
Ni har lärt er API:t StructuredTaskScope:
- Öppna i try-with-resources,
fork,joinoch sedanget - Varje deluppgift körs på en egen virtuell tråd
- Scopet garanterar att alla deluppgifter avslutas innan det stängs
- Kräver
--enable-preview
Nästa steg är en djupgående genomgång av policyerna för avslutning vid misslyckande och vid lyckat resultat.
Lär dig Java med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 104
- Lektioner
- 374
Vanliga frågor
Är lektionen ”StructuredTaskScope” gratis?
Ja – hela texten till ”StructuredTaskScope” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”StructuredTaskScope”?
Starta och sammanfoga deluppgifter. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Java Academy?
Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”StructuredTaskScope”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Java Academy-lektionen?
Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Modellen för strukturerad samtidighet
- StructuredTaskScope
- Avslut vid fel och framgång
- Felhantering och avbrytning