Gegeben Der folgende Code verwendet strukturierte Parallelität mit der Java 21-Vorschau:
Code: Select all
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Subtask d1Subtask = scope.fork(() -> getData1(input));
Subtask d2Subtask = scope.fork(() -> getData2(input));
scope.join().throwIfFailed(); // [1]
var data1 = d1Subtask.get(); // [2]
var data2 = d2Subtask.get();
return new Response(data1, data2);
}
[*]Wenn d1Subtask fehlschlägt, muss ich seine Ausnahme auslösen (
Code: Select all
d2Subtask
[*]wenn d1Subtask erfolgreich ist und d2Subtask fehlschlagen, benötige ich die Ausnahme von d2Subtask;
[*]Wenn beide erfolgreich sind, kombinieren Sie die Ergebnisse beider.
Wenn ich es ändere toscope.join(); then [2] kann fehlschlagen, wenn d1Subtask nicht ausgeführt wird. Es gibt d1Subtask.state(), aber darauf zu warten, dass es den Status State.UNAVAILABLE verlässt, scheint der Idee der strukturierten Parallelität zu widersprechen.
Dies kann mit erreicht werden Executors und reines StructuredTaskScope, aber das bedeutet möglicherweise, dass d2Subtask möglicherweise vollständig ausgeführt wird, selbst wenn der Bereich heruntergefahren und diese Aufgabe abgebrochen werden könnte.
Vorausgesetzt, das ist möglich zu ändern Soll der obige Code sauber und lesbar auf das Ergebnis von d1Subtask warten? Ich habe mir vorgestellt, dass so etwas wie „scope.join(d1Subtask) oder d1Subtask.join() die Vorgehensweise wäre, oder vielleicht eine andere Richtlinie, wenn diese API existieren würde.
Bearbeiten: Klarere Erklärung der gewünschten Logik mit jedem möglichen Ergebnis.