#java #completable-future
#java #завершаемое будущее
Вопрос:
Я пытаюсь запустить два метода void method1 и method2 асинхронно, а затем заблокировать код, пока не будут выполнены оба метода.
Достигает ли это этого?
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> method1());
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> method2());
CompletableFuture.allOf(future1, future2).join();
Комментарии:
1. ДА. Вы пробовали его запускать?
Ответ №1:
Я думаю, что код CompletableFuture.allOf(future1, future2).join();
должен работать нормально. Не могли бы вы попробовать это, у вас были какие-либо проблемы?
Или вы можете использовать что-то вроде:
Arrays.asList(future1,future1).forEach(Future::get);
Ответ №2:
Почему бы вам не использовать выделенный метод runAsync
?
public static void main(String[] args) {
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> method1());
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> method2());
CompletableFuture<Void> compound = CompletableFuture.allOf(future1, future2);
compound.join();
System.out.println("compound done");
}
И да, ваш compound
будет «присоединен» к другому потоку ( main
в примере выше), поэтому это compound done
сообщение будет напечатано только после выполнения обоих методов.