Beenden bei Fehler und Erfolg
Ergebnisse von Aufgaben koordinieren
Beenden bei Fehler und Erfolg ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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.
Zwei häufige Muster
Die meisten nebenläufigen Aufgabenverteilungen folgen einem von zwei Mustern:
- Alle müssen erfolgreich sein: Wenn eine fehlschlägt, werden die übrigen aufgegeben. Verwenden Sie
ShutdownOnFailure. - Der erste Erfolg zählt: Sobald eine Teilaufgabe erfolgreich ist, werden die übrigen abgebrochen. Verwenden Sie
ShutdownOnSuccess.
Das JDK stellt beide Varianten direkt bereit.
Das Prinzip von ShutdownOnFailure
ShutdownOnFailure eignet sich für Aufgaben, die alle erfolgreich abgeschlossen werden müssen, etwa wenn Sie gemeinsam ein Benutzerprofil und die zugehörigen Bestellungen abrufen.
Wenn eine Teilaufgabe eine Ausnahme auslöst, bricht der Scope die übrigen ab, damit keine Arbeit verschwendet wird.
Beispiel für ShutdownOnFailure
Nach join() rufen Sie throwIfFailed() auf. Diese Methode löst den ersten Fehler erneut aus, sofern einer aufgetreten ist, und verpackt ihn in einer ExecutionException.
import java.util.concurrent.StructuredTaskScope;
public class Main {
public static void main(String[] args) throws Exception {
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
var a = scope.fork(() -> fetch("profile"));
var b = scope.fork(() -> fetch("orders"));
scope.join();
scope.throwIfFailed();
System.out.println(a.get() + " + " + b.get());
}
}
static String fetch(String what) {
return what + "-ok";
}
}Was throwIfFailed bewirkt
throwIfFailed() überprüft die Teilaufgaben. Wenn alle erfolgreich waren, geschieht nichts. Wenn eine fehlgeschlagen ist, wird eine Ausnahme ausgelöst, die die ursprüngliche Ausnahme enthält.
Sie können auch eine Funktion übergeben, um die Ursache in einen eigenen Ausnahmetyp umzuwandeln.
Das Prinzip von ShutdownOnSuccess
ShutdownOnSuccess eignet sich für Redundanz oder einen Wettlauf: Fragen Sie mehrere Spiegelserver ab und verwenden Sie die Antwort, die zuerst eintrifft.
Sobald eine Teilaufgabe erfolgreich abgeschlossen ist, bricht der Scope die übrigen ab und speichert das gewinnende Ergebnis.
Beispiel für ShutdownOnSuccess
Mit result() rufen Sie den gewonnenen Wert ab. Die Methode löst eine Ausnahme aus, wenn keine Teilaufgabe erfolgreich war.
import java.util.concurrent.StructuredTaskScope;
public class Main {
public static void main(String[] args) throws Exception {
try (var scope = new StructuredTaskScope.ShutdownOnSuccess<String>()) {
scope.fork(() -> queryMirror("eu"));
scope.fork(() -> queryMirror("us"));
scope.join();
System.out.println("Fastest answer: " + scope.result());
}
}
static String queryMirror(String region) {
return region + "-data";
}
}result im Vergleich zu get
Beachten Sie den Unterschied:
ShutdownOnFailure: Lesen Sie jede Teilaufgabe mit ihrem eigenenget()ShutdownOnSuccess: Lesen Sie den einzelnen Gewinner mit demresult()des Scopes
Abbruch erfolgt kooperativ
Wenn ein Scope beendet wird, unterbricht er die verbleibenden Threads der Teilaufgaben. Gut implementierte Aufgaben prüfen die Unterbrechung und beenden sich zeitnah.
Blockierende Aufrufe in der Standardbibliothek reagieren im Allgemeinen automatisch auf Unterbrechungen.
join mit Zeitüberschreitung
Beide Richtlinien unterstützen eine Deadline. Der Aufruf von joinUntil(Instant) wartet nur bis zu einem bestimmten Zeitpunkt, löst dann TimeoutException aus und beendet den Scope.
Die passende Richtlinie wählen
Stellen Sie sich eine Frage: Benötige ich alle Ergebnisse oder nur das erste?
- Alle Ergebnisse, bei Fehler schnell abbrechen:
ShutdownOnFailure - Ein beliebiges Ergebnis, der schnellste Erfolg zählt:
ShutdownOnSuccess
Für alle anderen Fälle leiten Sie StructuredTaskScope ab.
Benutzerdefinierte Richtlinien
Sie können StructuredTaskScope erweitern und handleComplete(Subtask) überschreiben, um eigene Regeln zu implementieren, etwa das Sammeln der ersten N erfolgreichen Ergebnisse oder das Beenden nach einer bestimmten Anzahl von Fehlern.
Kurzer Test
Ordnen Sie das Szenario der passenden Richtlinie zu.
Zusammenfassung
Sie haben die beiden integrierten Richtlinien zum Beenden kennengelernt:
ShutdownOnFailure+throwIfFailed+getfür jede Teilaufgabe, wenn alle erfolgreich sein müssenShutdownOnSuccess+result, wenn der erste Erfolg zählt- Beim Beenden werden die verbleibenden Teilaufgaben kooperativ unterbrochen
joinUntilfügt Deadlines hinzu; durch Ableiten können Sie eigene Regeln implementieren
Als Nächstes geht es ausführlich um Fehlerbehandlung und Abbruch.
Häufig gestellte Fragen
Ist die Lektion „Beenden bei Fehler und Erfolg“ kostenlos?
Ja — der vollständige Text von „Beenden bei Fehler und Erfolg“ 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 „Beenden bei Fehler und Erfolg“?
Ergebnisse von Aufgaben koordinieren 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 3 von 4.
Wie lange dauert die Lektion „Beenden bei Fehler und Erfolg“?
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