futures.forEach (CompletableFuture :: join) выполняет все задачи параллельно? - PullRequest
1 голос
/ 25 февраля 2020

У меня есть несколько завершаемых фьючерсов, созданных как:

CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> xxx);
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> xxx);
List<CompletableFuture<Void>> futures = Lists.newArrayList(future1, future2);

Когда я запускаю ниже, эти две будущие задачи выполняются параллельно? Будет ли исключение сгенерировано одним будущим блоком другого?

futures.forEach(CompletableFuture::join);

1 Ответ

1 голос
/ 25 февраля 2020

При вызове CompletableFuture.runAsync(...) задачи передаются в common ForkJoinPool. Этот пул управляется JVM.

Поскольку это общий пул, не дается / не может быть сделано никаких гарантий относительно того, выполняются ли задачи на самом деле одновременно или параллельно (другие задачи могут быть переданы в пул, или пул может иметь в своем распоряжении только один поток, что приводит к последовательному выполнению задач). Но в лучшем случае они будут обрабатываться параллельно.

Exception в одной задаче не окажет влияния на другую задачу (если явно не реализовано в задачах). Фактически, без дальнейшей настройки Exception будет игнорироваться (чтобы поймать Exception s, явное UncaughtExceptionHandler может быть установлено при построении ForkJoinPool). Можно также выяснить, завершился ли ComletableFuture с Exception, вызвав isDone() (чтобы узнать, было ли выполнено задание) и isCompletedExceptionally() (для знать, завершено ли задание с Exception). Сам Exception можно получить, позвонив по номеру get(), но следует помнить, что Exception выбрасывается, не возвращается при вызове get().

...