CompletableFuture
— это класс в Java, который представляет собой асинхронную операцию, которая может быть завершена в будущем. Он был введен в Java 8 как часть пакета java.util.concurrent
и предоставляет мощный и гибкий способ работы с асинхронными вычислениями. CompletableFuture
реализует интерфейсы Future
и CompletionStage
, что позволяет комбинировать асинхронные задачи в цепочки и обрабатывать их результаты.
CompletableFuture
позволяет выполнять задачи асинхронно, то есть без блокировки основного потока. Это особенно полезно для операций, которые занимают много времени, таких как сетевые запросы или операции с базами данных.
Пример:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// Имитация длительной операции
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Результат выполнения";
});
Одной из мощных особенностей 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"
CompletableFuture
предоставляет методы для обработки исключений, которые могут возникнуть во время выполнения асинхронной задачи. Например, метод exceptionally
позволяет вернуть значение по умолчанию в случае ошибки.
Пример:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
if (true) {
throw new RuntimeException("Ошибка!");
}
return "Успех";
}).exceptionally(ex -> "Значение по умолчанию из-за ошибки: " + ex.getMessage());
future.thenAccept(System.out::println); // Выведет "Значение по умолчанию из-за ошибки: Ошибка!"
CompletableFuture
позволяет создавать цепочки вызовов, где каждая последующая задача выполняется после завершения предыдущей. Это достигается с помощью методов thenApply
, thenAccept
, thenRun
и других.
Пример:
CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(result -> result + " World")
.thenApply(String::toUpperCase)
.thenAccept(System.out::println); // Выведет "HELLO WORLD"
Иногда необходимо дождаться завершения всех или хотя бы одной из нескольких асинхронных задач. Для этого используются методы 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.