Метод join
Метод join класса CompletableFuture блокирует текущий поток до тех пор,
пока асинхронная операция не завершится, и возвращает её результат.
Метод не принимает параметров и не выбрасывает проверяемое исключение
InterruptedException. Если операция завершилась с ошибкой, метод
join выбрасывает непроверяемое исключение CompletionException,
внутри которого находится исходная причина ошибки.
Метод join удобно использовать в тех случаях, когда не хочется
обрабатывать проверяемое исключение, как это требуется при вызове метода
get. Однако стоит помнить, что вызов join блокирует поток,
поэтому его не рекомендуется использовать внутри асинхронных цепочек.
Синтаксис
completableFuture.join()
Пример
Давайте создадим асинхронную задачу, которая возвращает строку,
и дождёмся её результата с помощью метода 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"
Пример
Давайте создадим цепочку асинхронных преобразований
и получим её итоговый результат через метод join:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<Integer> future = CompletableFuture
.supplyAsync(() -> "12345")
.thenApply(str -> str.length());
Integer res = future.join();
System.out.println(res);
}
}
Результат выполнения кода:
5
Пример
Давайте рассмотрим, как метод join ведёт себя при ошибке
в асинхронной операции:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("error");
});
try
{
future.join();
}
catch (CompletionException e)
{
System.out.println(e.getCause().getMessage());
}
}
}
Результат выполнения кода:
"error"
Смотрите также
-
класс
CompletableFuture,
который представляет асинхронные вычисления -
метод
get,
который также ожидает результат, но выбрасывает проверяемое исключение -
метод
supplyAsync,
который создаёт асинхронную задачу с возвращаемым значением -
метод
thenApply,
который преобразует результат асинхронной операции