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

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

Сообщение Anonymous »

У меня есть сценарий, в котором мне нужно отправить два параллельных запроса, общий тайм-аут которых должен составлять 2 секунды. Однако, если время ожидания одного из запросов истечет, я хотел бы увидеть частичный результат другого запроса. И частичный результат может быть результатом или исключением. Поэтому я не хочу отключаться при сбоях. Я пытался решить эту проблему с помощью StructuredConcurrency:

Код: Выделить всё

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()) {

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);
}
}
}
Итак, вот результат:

Код: Выделить всё

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)
Состояние медленной задачи НЕДОСТУПНО. Состояние быстрой задачи — УСПЕХ, но невозможно выполнить ее. Он выдает IllegalStateException. Как лучше всего фиксировать результаты каждой подзадачи? Обновление внешних переменных из подзадач?

Подробнее здесь: https://stackoverflow.com/questions/797 ... ut-scenari
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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