Java 8 CompletableFuture. Часть 3 - Конец
Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8. Надеемся, что данная статья Вам будет полезна. Приятного прочтения!
В предыдущей статье мы рассмотрели объединение CompletableFuture в цепочку и обработку исключений. В этой статье мы рассмотрим параллельное исполнение нескольких CompletableFuture.
1. Введение
CompletableFuture - новый класс для асинхронной работы, который дает возможность комбинировать шаги обработки, соединяя их в цепочку. Класс содержит около 50 методов для выполнения, объединения а так же обработки исключений.
2. Исполнение нескольких CompletableFuture
Если мы захотим запустить несколько CompletableFuture параллельно, то сделать это можно с помощью allOf()
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CompletableFuture what = CompletableFuture.supplyAsync(() -> "What"); CompletableFuture the = CompletableFuture.supplyAsync(() -> "the"); CompletableFuture future = CompletableFuture.supplyAsync(() -> "future"); CompletableFuture holds = CompletableFuture.supplyAsync(() -> "holds"); CompletableFuture<Void> all = CompletableFuture.allOf(what, the, future, holds); all.get(); System.out.println(what.isDone()); //true System.out.println(what.isDone()); //true System.out.println(what.isDone()); //true System.out.println(what.isDone()); //true |
Но стоит помнить, что метод allOf() лишь запускает переданные задачи. Результат работы нужно получать у каждого CompletableFuture отдельно. Если же нам нужно получить результат работы всех задач, тогда можно воспользоваться методом join() и Stream API.
1 2 3 4 5 6 7 8 9 10 |
CompletableFuture<String> what = CompletableFuture.supplyAsync(() -> "What"); CompletableFuture<String> the = CompletableFuture.supplyAsync(() -> "the"); CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "future"); CompletableFuture<String> holds = CompletableFuture.supplyAsync(() -> "holds?"); String result = Stream.of(what, the, future, holds) .map(m -> m.join()) .collect(Collectors.joining(" ")); System.out.println(result); //output: What the future holds? |
Метод join() как и get() возвращает результат работы CompletableFuture, но в отличии от него join() бросает RuntimeException в случае ошибки исполнения. Данная особенность позволяет использовать ссылку на метод, и заменить
1 |
.map(m -> m.join()) |
на
1 |
.map(CompletableFuture::join) |
Это была завершающая статья по CompletableFuture. Если вы хотите узнать больше об API, то рекомендуем ознакомиться с документацией.
В Java 8 есть еще множество полезных нововведений, которые можно найти тут
Надеемся - наша статья была Вам полезна. Есть возможность записаться на наши курсы по Java. Детальную информацию смотрите у нас на сайте.