Java CompletableFuture: попытка запустить два метода void как CompletableFuture и блокировать, пока оба не завершатся

#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 сообщение будет напечатано только после выполнения обоих методов.