А CompltableFuture се използва за асинхронно програмиране. Асинхронното програмиране означава писане на неблокиращ код. Той изпълнява задача в отделна нишка от основната нишка на приложението и уведомява основната нишка за нейния напредък, завършване или неуспех.
По този начин основната нишка не блокира и не изчаква завършването на задачата. Други задачи се изпълняват паралелно. Паралелизмът подобрява производителността на програмата.
CompletableFuture е клас в Java. Принадлежи към пакета java.util.cocurrent. Той реализира интерфейс CompletionStage и Future.
Етап на завършване
- Той изпълнява действие и връща стойност, когато завърши друг етап на завършване.
- Модел за задача, която може да задейства други задачи.
Следователно, това е елемент от веригата.
Когато повече от една нишка се опитват да завършат - завършване по изключение или отмяна на CompletableFuture, само една от тях успява.
токенизатор на низове java
Бъдеще срещу CompletableFuture
CompletableFuture е разширение към Future API на Java, което беше въведено в Java 8.
Future се използва за асинхронно програмиране. Предоставя два метода, isDone() и get(). Методите извличат резултата от изчислението, когато то приключи.
Ограничения на бъдещето
- Едно бъдеще не може да бъде взаимно пълно.
- Не можем да извършим по-нататъшно действие върху резултата на Future без блокиране.
- Future няма обработка на изключения.
- Не можем да комбинираме множество фючърси.
Бъдещето има толкова много ограничения, затова имаме CompletableFuture. CompletableFuture предоставя широк набор от методи за създаване на множество фючърси, вериги и комбиниране. Освен това има цялостна поддръжка за обработка на изключения.
Създаване на CompletableFuture
Можем да създадем CompletableFuture само като използваме следния конструктор без аргументи.
CompletableFuture CompletableFuture = new CompletableFuture();
Пример
Най-често използваните CompletableFuture методи са:
import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; public class CompletableFutureExample1 { public static void main(String[] args) { try { List list = Arrays.asList(5,9,14); list.stream().map(num->CompletableFuture.supplyAsync(()->getNumber(num))).map(CompletableFuture->CompletableFuture.thenApply(n- >n*n)).map(t->t.join()).forEach(s->System.out.println(s)); } catch (Exception e) { e.printStackTrace(); } } private static int getNumber(int a) { return a*a; } }
Изход:
Обработка на изключение на CompletableFuture
Помислете за следната фигура, която представлява петте CF:
java сън
Да предположим, че има пет CF в изпълнение и CF21 предизвиква изключение, тогава всички зависими CF (CF31 и CF41) са в грешка. Означава, че:
- Извикването на метода isCompletedExceptionally() връща true.
- Извикването на get() хвърля ExecutionException, което причинява основното изключение.
Помислете за следната фигура, в която сме създали CF30 с изключение.
Когато CF21 се изпълнява нормално, тогава CF30 просто предава стойността. Ако предизвика изключение, CF30 го обработва и генерира стойност за CF31.
Има три метода за обработка на изключение:
public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);