StructuredTaskScope
Subtaken forken en samenvoegen
StructuredTaskScope is een gratis Java Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.
Maak kennis met StructuredTaskScope
StructuredTaskScope is de belangrijkste API voor gestructureerde concurrency. Je opent een bereik, voert fork uit voor deeltaken, gebruikt join om erop te wachten en leest vervolgens hun resultaten.
Het is een preview-functie, dus compileer en voer uit met --enable-preview.
De basislevenscyclus
Elk gebruik volgt hetzelfde ritme van vier stappen:
- Open het bereik in een try-with-resources-blok
- Voer voor een of meer deeltaken
forkuit; elke deeltaak retourneert een handle van het typeSubtask - Voer
joinuit om op voltooiing te wachten - Lees het resultaat van elke deeltaak via
get()
fork retourneert een handle
fork(Callable) start de deeltaak onmiddellijk op een virtuele thread en retourneert een Subtask. Je mag de get() ervan pas aanroepen nadat join() is teruggekeerd.
Een volledig voorbeeld
Hier worden twee deeltaken gelijktijdig uitgevoerd. Beide moeten zijn voltooid voordat we de resultaten lezen. Hierbij wordt ShutdownOnFailure gebruikt, een ingebouwde beleidsregel.
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");
}
}
}Eerst join, dan lezen
De volgorde ligt vast: fork, vervolgens join en daarna get. Als je get() van een deeltaak aanroept voordat join() is voltooid, wordt IllegalStateException opgegooid.
Dankzij deze regel blijft de levensduur gestructureerd.
Statussen van deeltaken
Na join() rapporteert elke Subtask een state():
SUCCESSmet een resultaat vanget()FAILEDmet de uitzondering vanexception()UNAVAILABLEals de deeltaak nooit is voltooid
Veel deeltaken
Je kunt zo veel deeltaken als je wilt starten met fork; elke deeltaak krijgt een eigen virtuele thread. Zo spreid je een batch onafhankelijke aanroepen.
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);
}
}
}Het bereik beheert de threads
Het bereik implementeert AutoCloseable. Wanneer het try-blok eindigt, zorgt close() ervoor dat elke thread van een deeltaak is beëindigd. Lekken zijn niet mogelijk.
Daarom gebruik je het altijd binnen try-with-resources.
Ingebouwde beleidsregels
De JDK levert twee kant-en-klare afsluitbeleidsregels:
ShutdownOnFailure: annuleer de overige deeltaken als een deeltaak misluktShutdownOnSuccess: annuleer de overige deeltaken zodra er één slaagt
Je kunt ook een subklasse van StructuredTaskScope maken voor aangepaste logica.
join vanuit dezelfde thread
Alleen de thread die het bereik heeft geopend, mag er deeltaken in forken en join aanroepen. Deeltaken blijven beperkt tot hun bijbehorende bereik, waardoor de boom correct opgebouwd blijft.
Opties voor compileren en uitvoeren
Omdat de API een preview is, bouw je met:
javac --release 21 --enable-preview Main.javajava --enable-preview Main
Zonder de optie krijg je een compilatie- of uitvoeringsfout.
Korte controle
Denk aan de verplichte aanroepvolgorde.
Samenvatting
Je hebt de API StructuredTaskScope geleerd:
- Open het bereik in try-with-resources, voer
forkuit, daarnajoinen vervolgensget - Elke deeltaak wordt uitgevoerd op een eigen virtuele thread
- Het bereik garandeert dat alle deeltaken worden beëindigd voordat het wordt gesloten
--enable-previewis vereist
Volgende: de beleidsregels voor afsluiten bij mislukking en afsluiten bij succes in detail.
Leer Java met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 104
- Lessen
- 374
Veelgestelde vragen
Is de les “StructuredTaskScope” gratis?
Ja — de volledige tekst van “StructuredTaskScope” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.
Wat leer ik in “StructuredTaskScope”?
Subtaken forken en samenvoegen Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Java Academy te beginnen?
Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “StructuredTaskScope”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Java Academy?
Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Het model van gestructureerde concurrency
- StructuredTaskScope
- Afsluiten bij fouten en succes
- Foutafhandeling en annulering