Гарантии заказа с использованием потоков и сокращением цепочки потребителейJAVA

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

Сообщение Anonymous »

Итак, в текущем сценарии у нас есть набор API, перечисленных ниже:

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

Consumer start();
Consumer performDailyAggregates();
Consumer performLastNDaysAggregates();
Consumer repopulateScores();
Consumer updateDataStore();
При этом один из наших планировщиков выполняет задачи, например:

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

private void performAllTasks(T data) {
start().andThen(performDailyAggregates())
.andThen(performLastNDaysAggregates())
.andThen(repopulateScores())
.andThen(updateDataStore())
.accept(data);
}
Просматривая это, я подумал о переходе к более гибкой реализации 1 выполнения задач, которая выглядела бы так: :

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

// NOOP in the context further stands for  'anything -> {}'
private void performAllTasks(Stream consumerList, T data) {
consumerList.reduce(NOOP, Consumer::andThen).accept(data);
}


Сейчас мне приходит в голову то, что в Javadoc четко указано, что

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

accumulator
 — ассоциативная, неинтерферирующая функция без сохранения состояния для
объединения двух значений


Далее я подумал Как обеспечить порядок обработки в потоках Java8? быть упорядоченным (порядок обработки должен быть таким же, как порядок обнаружения)!

Хорошо, поток, сгенерированный из списка, будет быть упорядоченным, и если поток не будет параллельным перед сокращением, следующая реализация будет работать. 2

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

private void performAllTasks(List consumerList, T data) {
consumerList.stream().reduce(NOOP, Consumer::andThen).accept(data);
}
В. Верно ли это предположение 2? Будет ли гарантированно всегда выполняться потребители в том порядке, в котором они были в исходном коде?

В. Есть ли возможность каким-либо образом предоставить 1 вызываемым объектам для выполнения задач?

Подробнее здесь: https://stackoverflow.com/questions/598 ... -consumers

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