Java 21 strukturierte Parallelität, erfordert eine vorhersehbare Reihenfolge der Unteraufgaben-AusnahmenJava

Java-Forum
Guest
 Java 21 strukturierte Parallelität, erfordert eine vorhersehbare Reihenfolge der Unteraufgaben-Ausnahmen

Post by Guest »

Ich bin relativ neu im Bereich des parallelen Codes und habe versucht, einige Codes, die auf Executoren basieren, in strukturierte Parallelität umzuwandeln, aber ich habe eine wichtige Eigenschaft verloren, die ich irgendwie behalten muss.
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);
}
In [1] wird eventuell eine erste Ausnahme der beiden Unteraufgaben ausgelöst, und das möchte ich nicht. Ich muss beide Aufgaben parallel ausführen, aber ich brauche zuerst das Ergebnis von d1Subtask für den Fall, dass es fehlschlägt. Mit anderen Worten:

[*]Wenn d1Subtask fehlschlägt, muss ich seine Ausnahme auslösen (

Code: Select all

d2Subtask
kann ausgeführt werden, erfolgreich sein oder fehlschlagen und nichts davon spielt eine Rolle, Ausnahmen von d1Subtask machen die zweite Aufgabe irrelevant);
[*]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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post