Метод get класса CompletableFuture
Метод get класса CompletableFuture блокирует текущий поток до тех пор,
пока асинхронная операция не завершится, и возвращает полученный результат.
Если операция завершилась с ошибкой, метод выбрасывает исключение ExecutionException,
внутри которого находится исходная причина. Если текущий поток был прерван во время
ожидания, выбрасывается InterruptedException. Параметров у метода нет в базовой
версии, но существует перегрузка с таймаутом: в первый параметр мы передаём время
ожидания, во второй - единицу измерения времени.
Синтаксис
completableFuture.get()
completableFuture.get(timeout, unit)
Пример
Давайте создадим асинхронную задачу, которая возвращает строку,
и получим её результат с помощью метода get:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args) throws Exception
{
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "abcde");
String res = future.get();
System.out.println(res);
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте получим результат асинхронного вычисления числа:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args) throws Exception
{
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 5 + 10);
Integer res = future.get();
System.out.println(res);
}
}
Результат выполнения кода:
15
Пример
Давайте посмотрим, что произойдёт, если асинхронная операция завершилась с ошибкой:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("failure");
});
try
{
String res = future.get();
System.out.println(res);
}
catch (ExecutionException e)
{
System.out.println(e.getCause().getMessage());
}
catch (InterruptedException e)
{
System.out.println("interrupted");
}
}
}
Результат выполнения кода:
"failure"
Пример
Давайте получим результат с ограничением по времени ожидания:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args) throws Exception
{
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "12345");
String res = future.get(1, TimeUnit.SECONDS);
System.out.println(res);
}
}
Результат выполнения кода:
"12345"
Смотрите также
-
метод
join,
который ожидает завершения без проверяемых исключений -
метод
thenApply,
который преобразует результат -
метод
exceptionally,
который обрабатывает ошибки -
класс
CompletableFuture,
который представляет асинхронную операцию