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?
Wie bekomme ich Teilergebnisse mit Java -strukturierten Parallelität in einem Zeitüberschreitungsszenario? ⇐ Java
-
- Similar Topics
- Replies
- Views
- Last post