logo

Какво е CompletableFuture?

А 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 методи са:

    supplyAsync():Завършва работата си асинхронно. Резултатът от доставчика се изпълнява от задача от ForkJoinPool.commonPool() по подразбиране. Методът supplyAsync() връща CompletableFuture, върху който можем да приложим други методи.thenApply():Методът приема функция като аргументи. Той връща нов CompletableStage, когато този етап завърши нормално. Новият етап се използва като аргумент на предоставената функция.присъединяване():методът връща резултатната стойност, когато е завършен. Той също така хвърля CompletionException (непроверено изключение), ако е завършен по изключение.
 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 в Java

Обработка на изключение на CompletableFuture

Помислете за следната фигура, която представлява петте CF:

java сън
CompletableFuture в Java

Да предположим, че има пет CF в изпълнение и CF21 предизвиква изключение, тогава всички зависими CF (CF31 и CF41) са в грешка. Означава, че:

  • Извикването на метода isCompletedExceptionally() връща true.
  • Извикването на get() хвърля ExecutionException, което причинява основното изключение.

Помислете за следната фигура, в която сме създали CF30 с изключение.

CompletableFuture в Java

Когато CF21 се изпълнява нормално, тогава CF30 просто предава стойността. Ако предизвика изключение, CF30 го обработва и генерира стойност за CF31.

Има три метода за обработка на изключение:

 public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);