Дано следующий код, использующий структурированный параллелизм с предварительной версией Java 21:
Код: Выделить всё
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);
}
[*]если d1Subtask завершается с ошибкой, мне нужно выдать ее исключение (
Код: Выделить всё
d2Subtask
[*]если d1Subtask завершается успешно и d2Subtask не работают, мне нужно исключение из d2Subtask;
[*]если оба успешны, объедините результаты обоих.
Если я изменю его наscope.join();, то [2] может завершиться неудачно, если d1Subtask не будет выполнена. Существует d1Subtask.state(), но ожидание выхода из состояния State.UNAVAILABLE противоречит идее структурированного параллелизма.
Этого можно достичь с помощью Исполнители и чистый StructuredTaskScope, но это означает потенциальное выполнение d2Subtask до завершения, даже если область может быть отключена и эта задача прервана.
Учитывая это, это возможно к изменить приведенный выше код, чтобы он ждал результата d1Subtask в чистом и читаемом виде? Я предполагал, что для этого можно использовать что-то вродеscope.join(d1Subtask) или d1Subtask.join(), или, возможно, другую политику, если такой API существует.
Редактирование: более четкое объяснение желаемой логики для каждого возможного результата.
Подробнее здесь: https://stackoverflow.com/questions/780 ... n-ordering