Структурированный параллелизм Java 21 требует предсказуемого порядка исключений подзадачJAVA

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

Сообщение Anonymous »

Я новичок в параллельном коде, и я пытался преобразовать некоторый код, основанный на исполнителях, в структурированный параллелизм, но я потерял важное свойство, которое мне нужно каким-то образом сохранить.
Дано следующий код, использующий структурированный параллелизм с предварительной версией 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);
}
В [1] выдается первое исключение из двух подзадач, а я этого не хочу. Мне нужно запустить обе задачи параллельно, но сначала мне нужен результат d1Subtask на случай сбоя. Другими словами:

[*]если d1Subtask завершается с ошибкой, мне нужно выдать ее исключение (

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

d2Subtask
может работать, быть успешным или неудачным, и все это не имеет значения, исключения из d1Subtask делают вторую задачу неактуальной);
[*]если 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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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