Я столкнулся с проблемой, когда последовательно выполняю два объекта CompletableFuture. Мое намерение состоит в том, чтобы завершить первое и только после этого приступить к выполнению второго. Другими словами, второе зависит от завершения первого.
Я не могу поделиться точным кодом, но вот упрощенная версия того, что я делаю:
public static void main() {
Set<Object> firstSet = /* ... */
Set<Object> secondSet = /* ... */
CompletableFuture<Void> firstFuture = getFuture(firstSet);
CompletableFuture<Void> secondFuture = getFuture(secondSet);
// Want to ensure that secondFuture does not begin executing until
// all of the futures in firstFuture have completed
firstFuture.join();
secondFuture.join();
}
CompletableFuture<Void> getFuture(Set<Object> listOfObjects) {
List<CompletableFuture<Void>> futures = listOfObjects
.stream()
.map(object -> CompletableFuture.runAsync(getRunnableForObject(object), executorService))
.collect(Collectors.toList());
CompletableFuture<Void> future = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
return future;
}
Runnable getRunnableForObject(Object obj) {
// assume this returns a custom runnable whose execution behavior depend on the object parameter
}
При запуске кода я вижу, что иногда журналы, напечатанные во время выполнения firstFuture.join(), имеют отметку времени, которая позже, чем некоторые журналы, напечатанные во время secondFuture.join(). Я ожидаю, что мы никогда не увидим какие-либо журналы, напечатанные во время secondFuture, перед любыми журналами, напечатанными во время firstFuture.
Я думал, что firstFuture.join() гарантирует, что будущее завершится полностью, прежде чем синхронно перейти к secondFuture.join(), но, возможно, я неправильно понимаю. Кто-нибудь может посоветовать?




Этот код запускает фоновые задачи для обоих наборов, чтобы они выполнялись одновременно:
CompletableFuture<Void> firstFuture = getFuture(firstSet);
CompletableFuture<Void> secondFuture = getFuture(secondSet);
Простой способ обеспечить первый/второй порядок, просто переключив эти строки на:
CompletableFuture<Void> firstFuture = getFuture(firstSet);
firstFuture.join();
CompletableFuture<Void> secondFuture = getFuture(secondSet);
secondFuture.join();
Спасибо! Кажется, это решает проблему для меня.