Ваша проблема в блоке future.get () и дождитесь результата.Это будет просто, если вы используете библиотеку Vavr.Потому что он может прикрепить код к своему будущему, который запускается автоматически при успехе или неудаче.Так что вам не нужно ждать.Вот пример, который использует будущее Vavr.
CheckedFunction0<String> thisIsATask = () -> {
if ( /*do something*/ ){
throw new Exception("Hey");
}
return "ABC";
};
List<Future<String>> futureList = new ArrayList<>();
for (int x = 0; x < 10; x++) {
futureList.add(Future.of(getExecutorService(), thisIsATask));
}
futureList.forEach((task) -> {
// This will run if success
task.onSuccess(s -> s.equals("ABC") ? Platform.runLater(()->UpdateCounter()) : wtf());
// Your get the exception if it is fail;
task.onFailure(e -> e.printStackTrace());
// task.onComplete() will run on any case when complete
});
Это не блокировка, код в onSucess onFailure или onComplete будет выполняться, когда задача завершится или будет получено исключение.
Примечание: Future.of будет использовать executorService, который вы передаете для запуска каждой задачи в новом потоке, код, который вы предоставляете в onSuccess, будет продолжать выполняться в этом потоке после выполнения задачи, поэтому, если вы вызываете javafx, запомните Platform.runLater ()
Также, если вы хотите запустить что-то, когда все задачи завершены, тогда
// the code at onComplete will run when tasks all done
Future<Seq<String>> all = Future.sequence(futureList);
all.onComplete((i) -> this.btnXYZ.setDisable(false));