StructuredTaskScope
Unteraufgaben starten und zusammenführen
StructuredTaskScope ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
StructuredTaskScope kennenlernen
StructuredTaskScope ist die zentrale API der strukturierten Nebenläufigkeit. Sie öffnen einen Scope, starten Teilaufgaben mit fork, warten mit join auf sie und lesen anschließend ihre Ergebnisse.
Es handelt sich um eine Preview-Funktion. Kompilieren und starten Sie das Programm daher mit --enable-preview.
Der grundlegende Lebenszyklus
Jede Verwendung folgt demselben Ablauf in vier Schritten:
- Öffnen Sie den Scope in einem try-with-resources-Block
- Starten Sie mit
forkeine oder mehrere Teilaufgaben, die jeweils einSubtask-Handle zurückgeben - Warten Sie mit
joinauf den Abschluss - Lesen Sie das Ergebnis jeder Teilaufgabe über
get()
fork gibt ein Handle zurück
fork(Callable) startet die Teilaufgabe sofort in einem virtuellen Thread und gibt ein Subtask zurück. Sie dürfen get() erst aufrufen, nachdem join() zurückgekehrt ist.
Ein vollständiges Beispiel
Hier laufen zwei Teilaufgaben nebenläufig. Beide müssen abgeschlossen sein, bevor wir die Ergebnisse lesen. Dabei wird ShutdownOnFailure, eine integrierte Richtlinie, verwendet.
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, dann get
Die Reihenfolge ist strikt: fork, dann join, dann get. Wenn Sie get() für eine Teilaufgabe aufrufen, bevor join() abgeschlossen ist, wird IllegalStateException ausgelöst.
Diese Regel sorgt dafür, dass die Lebensdauer strukturiert bleibt.
Zustände von Subtasks
Nach join() meldet jedes Subtask einen state():
SUCCESSmit einem Ergebnis vonget()FAILEDmit der Ausnahme vonexception()UNAVAILABLE, wenn die Teilaufgabe nie abgeschlossen wurde
Viele Teilaufgaben
Sie können beliebig viele Teilaufgaben mit fork starten; jede erhält ihren eigenen virtuellen Thread. So verteilen Sie einen Stapel unabhängiger Aufrufe auf mehrere Threads.
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);
}
}
}Der Scope verwaltet die Threads
Der Scope ist ein AutoCloseable. Wenn der try-Block endet, stellt close() sicher, dass jeder Thread einer Teilaufgabe beendet wurde. Leaks sind nicht möglich.
Deshalb verwenden Sie ihn immer innerhalb von try-with-resources.
Integrierte Richtlinien
Das JDK enthält zwei sofort einsetzbare Richtlinien zum Beenden:
ShutdownOnFailure: Bricht die übrigen Teilaufgaben ab, wenn eine Teilaufgabe fehlschlägtShutdownOnSuccess: Bricht die übrigen Teilaufgaben ab, sobald eine erfolgreich abgeschlossen wurde
Für eine eigene Logik können Sie außerdem StructuredTaskScope ableiten.
Join im selben Thread
Nur der Thread, der den Scope geöffnet hat, darf darin Teilaufgaben mit fork starten und join aufrufen. Teilaufgaben sind auf ihren übergeordneten Scope beschränkt, sodass der Baum korrekt aufgebaut bleibt.
Flags zum Kompilieren und Starten
Da die API eine Preview-API ist, kompilieren Sie mit:
javac --release 21 --enable-preview Main.javajava --enable-preview Main
Ohne das Flag erhalten Sie einen Kompilierungs- oder Laufzeitfehler.
Kurzer Test
Rufen Sie sich die vorgeschriebene Reihenfolge der Aufrufe ins Gedächtnis.
Zusammenfassung
Sie haben die StructuredTaskScope-API kennengelernt:
- In try-with-resources öffnen, dann
fork,joinund anschließendget - Jede Teilaufgabe läuft in ihrem eigenen virtuellen Thread
- Der Scope garantiert, dass alle Teilaufgaben vor dem Schließen beendet sind
--enable-previewist erforderlich
Als Nächstes betrachten wir die Richtlinien zum Beenden bei Fehlern und beim ersten Erfolg im Detail.
Häufig gestellte Fragen
Ist die Lektion „StructuredTaskScope“ kostenlos?
Ja — der vollständige Text von „StructuredTaskScope“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „StructuredTaskScope“?
Unteraufgaben starten und zusammenführen Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „StructuredTaskScope“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Das Modell der strukturierten Nebenläufigkeit
- StructuredTaskScope
- Beenden bei Fehler und Erfolg
- Fehlerbehandlung und Abbruch