Итак, у меня есть пара фьючерсов, которые я хочу запустить, даже если некоторые из них потерпят неудачу, я бы хотел, чтобы у всех был шанс запустить. Так что если я сделаю:
CompletableFuture.allOf(futures).join()
Будет ли это так? Я рассуждаю так: каждое будущее будет иметь свою собственную очередь в своем исполнителе и, следовательно, все будет работать, если основной поток не завершится первым. Моя проблема в том, что я специально .join()
на .allOf()
, поэтому мое приложение не заканчивается, прежде чем запустить все
Итак, семантика allOf()
смущает меня: завершится ли будущее возвращение, когда все пройденные фьючерсы завершатся независимо от того, успешны ли они? Или он завершит неудачное будущее, если увидит неудачу, не дожидаясь остальных?
EDIT
Чтобы проиллюстрировать мой вопрос далее, .allOf
ведет себя так:
Stream.of(futures).forEach(future -> {
try {
future.join()
} catch (Throwable e) {
//dont throw, we want to join the rest
}
})
Или это ведет себя так:
Stream.of(futures).forEach(future -> {
try {
future.join()
} catch (Throwable e) {
throw e; //All other remaining .join() wont run
}
})
Что это? первый или второй случай? Поскольку я хочу, чтобы первый случай был тем, что я временно использую в своем коде, но я бы хотел использовать allOf()
, если это возможно, потому что он более эстетичный
Спасибо!