Класс CompletableFuture
Класс CompletableFuture представляет собой
асинхронную задачу, которая может завершиться
успешно или с ошибкой. Он реализует интерфейс
Future и интерфейс CompletionStage,
что позволяет строить цепочки асинхронных
вычислений, комбинировать несколько задач,
обрабатывать исключения и получать результат
без блокировки потока. Экземпляр класса можно
создать через статические методы supplyAsync,
runAsync, completedFuture,
а также через конструктор без параметров.
Синтаксис
CompletableFuture<T> future = new CompletableFuture<>();
CompletableFuture<T> future = CompletableFuture.supplyAsync(Supplier<T>);
CompletableFuture<Void> future = CompletableFuture.runAsync(Runnable);
CompletableFuture<T> future = CompletableFuture.completedFuture(T value);
Пример
Давайте создадим асинхронную задачу, которая
возвращает строку, и получим её результат
через метод join:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "abcde");
String res = future.join();
System.out.println(res);
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте создадим цепочку вычислений через метод
thenApply, который преобразует результат
предыдущей задачи:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture
.supplyAsync(() -> "abcde")
.thenApply(str -> str.toUpperCase());
String res = future.join();
System.out.println(res);
}
}
Результат выполнения кода:
"ABCDE"
Пример
Давайте обработаем исключение через метод
exceptionally, который вернёт запасное
значение при ошибке:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture
.supplyAsync(() -> {
throw new RuntimeException("error");
})
.exceptionally(ex -> "default");
String res = future.join();
System.out.println(res);
}
}
Результат выполнения кода:
"default"
Пример
Давайте скомбинируем две асинхронные задачи
через метод thenCombine и получим
общий результат:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> first = CompletableFuture.supplyAsync(() -> "abcde");
CompletableFuture<String> second = CompletableFuture.supplyAsync(() -> "12345");
CompletableFuture<String> combined = first.thenCombine(second, (a, b) -> a + b);
String res = combined.join();
System.out.println(res);
}
}
Результат выполнения кода:
"abcde12345"
Смотрите также
-
метод
supplyAsync,
который создаёт асинхронную задачу с результатом -
метод
thenApply,
который преобразует результат задачи -
метод
exceptionally,
который обрабатывает исключение задачи -
метод
allOf,
который объединяет несколько задач в одну