logo

Що таке CompletableFuture?

А CompltableFuture використовується для асинхронного програмування. Асинхронне програмування означає написання неблокуючого коду. Він запускає завдання в окремому потоці, ніж основний потік програми, і сповіщає основний потік про його хід, завершення або помилку.

Таким чином, основний потік не блокує і не чекає завершення завдання. Інші завдання виконуються паралельно. Паралелізм покращує продуктивність програми.

CompletableFuture — це клас у Java. Він належить пакету java.util.cocurrent. Він реалізує інтерфейс CompletionStage і Future.

Стадія завершення

  • Він виконує дію та повертає значення, коли завершується інший етап завершення.
  • Модель для завдання, яке може викликати інші завдання.

Отже, це елемент ланцюга.

Коли кілька потоків намагаються завершити - завершити виключно або скасувати CompletableFuture, лише один з них вдається.

різниця в датах Excel

Майбутнє проти CompletableFuture

CompletableFuture — це розширення Java Future API, яке було представлено в 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:

CompletableFuture в Java

Припустімо, що виконується п’ять CF і CF21 викликає виняток, тоді всі залежні CF (CF31 і CF41) є помилковими. Це означає, що:

  • Виклик методу isCompletedExceptionly() повертає значення true.
  • Виклик get() викликає ExecutionException, який викликає кореневий виняток.

Розглянемо наступний малюнок, на якому ми створили CF30 за винятком.

CompletableFuture в Java

Коли CF21 виконується нормально, тоді CF30 просто передає значення. Якщо він викликає виняток, CF30 обробляє його та генерує значення для CF31.

Існує три способи обробки винятку:

розширений цикл java
 public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);