А 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:
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:
Припустімо, що виконується п’ять CF і CF21 викликає виняток, тоді всі залежні CF (CF31 і CF41) є помилковими. Це означає, що:
- Виклик методу isCompletedExceptionly() повертає значення true.
- Виклик get() викликає ExecutionException, який викликає кореневий виняток.
Розглянемо наступний малюнок, на якому ми створили CF30 за винятком.
Коли CF21 виконується нормально, тоді CF30 просто передає значення. Якщо він викликає виняток, CF30 обробляє його та генерує значення для CF31.
Існує три способи обробки винятку:
розширений цикл java
public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);