0Pricing
Java Academy · Lektion

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 fork eine oder mehrere Teilaufgaben, die jeweils ein Subtask-Handle zurückgeben
  • Warten Sie mit join auf 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():

  • SUCCESS mit einem Ergebnis von get()
  • FAILED mit der Ausnahme von exception()
  • 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ägt
  • ShutdownOnSuccess: 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.java
  • java --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, join und anschließend get
  • Jede Teilaufgabe läuft in ihrem eigenen virtuellen Thread
  • Der Scope garantiert, dass alle Teilaufgaben vor dem Schließen beendet sind
  • --enable-preview ist 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

  1. Das Modell der strukturierten Nebenläufigkeit
  2. StructuredTaskScope
  3. Beenden bei Fehler und Erfolg
  4. Fehlerbehandlung und Abbruch
← Zurück zu Java Academy