Как получить частичные результаты с помощью сктуктурированного параллелизма Java в сценарии тайм -аута?JAVA

Программисты JAVA общаются здесь
Anonymous
Как получить частичные результаты с помощью сктуктурированного параллелизма Java в сценарии тайм -аута?

Сообщение Anonymous »

У меня есть сценарий, в котором мне нужно отправить два параллельных запроса, где они должны иметь комбинированный тайм -аут 2 секунды. Однако, если один из запросов, я хотел бы увидеть частичный результат другого запроса. И частичный результат может быть результатом или исключением. Поэтому я не хочу закрывать неудачи. Я попытался решить это так со структурированной Concurrency: < /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>
Итак, это выход: < /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>
Так медленное состояние задачи недоступно. Состояние Fast Task - это успех, но не может позвонить, чтобы получить его. Это бросает allodalstateException. Как лучше всего запечатлеть результаты, которые излучает каждая подзадача? Обновление внешних переменных из подзадач? Пожалуйста, предложите.

Подробнее здесь: https://stackoverflow.com/questions/797 ... out-scenar

Вернуться в «JAVA»