Wie bekomme ich Teilergebnisse mit Java -strukturierten Parallelität in einem Zeitüberschreitungsszenario?Java

Java-Forum
Anonymous
 Wie bekomme ich Teilergebnisse mit Java -strukturierten Parallelität in einem Zeitüberschreitungsszenario?

Post by Anonymous »

Ich habe ein Szenario, in dem ich zwei parallele Anfragen senden muss, in denen sie eine kombinierte Auszeit von 2 Sekunden haben sollten. Wenn jedoch eine der Anfragen ausfällt, möchte ich das Teilergebnis der anderen Anfrage sehen. Und Teilergebnisse können ein Ergebnis oder eine Ausnahme sein. Daher möchte ich keine Fehler abbauen. Ich hatte versucht, es so mit strukturierter Konzern zu lösen: < /p>
import java.time.Instant;
import java.util.concurrent.StructuredTaskScope;
import java.util.concurrent.TimeoutException;

public class Main {
public static void main(String[] myData) {
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {

var subtask1 = scope.fork(() -> {
Thread.sleep(3000);
return "slow";
});
var subtask2 = scope.fork(() -> {
Thread.sleep(1000);
return "fast";
});

try {
scope.joinUntil(Instant.now().plusMillis(2000));
} catch (TimeoutException te) {
System.out.println("Timeout occurred");
}

switch (subtask1.state()) {
case SUCCESS -> System.out.println("1s"+subtask1.get());
case FAILED -> System.out.println("1f");
case UNAVAILABLE -> System.out.println("1u");
case null, default -> System.out.println("1w");
}

switch (subtask2.state()) {
case SUCCESS -> System.out.println("2s"+subtask2.get());
case FAILED -> System.out.println("2f");
case UNAVAILABLE -> System.out.println("2u");
case null, default -> System.out.println("2w");
}

} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
< /code>
Dies ist also die Ausgabe: < /p>
Timeout occurred
1u
Exception in thread "main" java.lang.IllegalStateException: Owner did not join after forking subtasks
at java.base/java.util.concurrent.StructuredTaskScope.newIllegalStateExceptionNoJoin(StructuredTaskScope.java:439)
at java.base/java.util.concurrent.StructuredTaskScope.ensureJoinedIfOwner(StructuredTaskScope.java:477)
at java.base/java.util.concurrent.StructuredTaskScope$SubtaskImpl.get(StructuredTaskScope.java:917)
at org.example.Main.main(Main.java:34)
< /code>
Der Status der langsamen Aufgabe ist also nicht verfügbar. Der Staat der schnellen Aufgabe ist Erfolg, aber nicht in der Lage, aufzunehmen. Es wirft IllegalStateException aus. Was ist der beste Weg, um die Ergebnisse zu erfassen, die jede Subtask emittiert? Außenvariablen aus den Unteraufgaben aktualisieren?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post