Как работает CompletableFuture?java-64

CompletableFuture — это класс в Java, который представляет собой асинхронную операцию, которая может быть завершена в будущем. Он был введен в Java 8 как часть пакета java.util.concurrent и предоставляет мощный и гибкий способ работы с асинхронными вычислениями. CompletableFuture реализует интерфейсы Future и CompletionStage, что позволяет комбинировать асинхронные задачи в цепочки и обрабатывать их результаты.

Основные концепции

1. Асинхронное выполнение

CompletableFuture позволяет выполнять задачи асинхронно, то есть без блокировки основного потока. Это особенно полезно для операций, которые занимают много времени, таких как сетевые запросы или операции с базами данных.

Пример:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // Имитация длительной операции
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "Результат выполнения";
});

2. Комбинирование задач

Одной из мощных особенностей CompletableFuture является возможность комбинировать несколько асинхронных задач. Например, вы можете выполнить одну задачу после завершения другой или объединить результаты нескольких задач.

Пример:

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");

CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + " " + result2);

combinedFuture.thenAccept(System.out::println); // Выведет "Hello World"

3. Обработка исключений

CompletableFuture предоставляет методы для обработки исключений, которые могут возникнуть во время выполнения асинхронной задачи. Например, метод exceptionally позволяет вернуть значение по умолчанию в случае ошибки.

Пример:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    if (true) {
        throw new RuntimeException("Ошибка!");
    }
    return "Успех";
}).exceptionally(ex -> "Значение по умолчанию из-за ошибки: " + ex.getMessage());

future.thenAccept(System.out::println); // Выведет "Значение по умолчанию из-за ошибки: Ошибка!"

4. Цепочки вызовов

CompletableFuture позволяет создавать цепочки вызовов, где каждая последующая задача выполняется после завершения предыдущей. Это достигается с помощью методов thenApply, thenAccept, thenRun и других.

Пример:

CompletableFuture.supplyAsync(() -> "Hello")
    .thenApply(result -> result + " World")
    .thenApply(String::toUpperCase)
    .thenAccept(System.out::println); // Выведет "HELLO WORLD"

5. Ожидание завершения

Иногда необходимо дождаться завершения всех или хотя бы одной из нескольких асинхронных задач. Для этого используются методы allOf и anyOf.

Пример:

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Task 1");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "Task 2");

CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);

allFutures.thenRun(() -> {
    System.out.println("Все задачи завершены");
});

Резюмируем

CompletableFuture — это мощный инструмент для работы с асинхронными вычислениями в Java. Он позволяет выполнять задачи без блокировки основного потока, комбинировать результаты нескольких задач, обрабатывать исключения и создавать цепочки вызовов. Благодаря своей гибкости и простоте использования, CompletableFuture стал стандартным выбором для асинхронного программирования в Java.