Метод complete класса CompletableFuture
Метод complete класса CompletableFuture
завершает асинхронную задачу значением, переданным
в первом параметре. Если CompletableFuture уже
завершён (неважно, значением или исключением), вызов
ничего не меняет. Метод возвращает true, если
удалось завершить будущее, и false, если оно
уже было завершено ранее. В первый параметр мы
передаём значение, которым нужно завершить
CompletableFuture.
Метод особенно полезен, когда результат вычисляется не асинхронно, а по событию: например, при получении ответа от внешнего источника или при завершении другой задачи. С его помощью можно вручную «закрыть» будущее и тем самым разблокировать все зависимые от него вычисления.
Синтаксис
boolean complete(T value)
Пример
Давайте создадим незавершённый CompletableFuture
и завершим его строкой "abcde":
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = new CompletableFuture<>();
boolean res = future.complete("abcde");
System.out.println(res);
System.out.println(future.join());
}
}
Результат выполнения кода:
true
"abcde"
Пример
Если CompletableFuture уже завершён, повторный
вызов complete вернёт false и не изменит
значение:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = new CompletableFuture<>();
boolean first = future.complete("abcde");
boolean second = future.complete("12345");
System.out.println(first);
System.out.println(second);
System.out.println(future.join());
}
}
Результат выполнения кода:
true
false
"abcde"
Пример
Метод complete можно использовать для ручного
завершения будущего из другого потока. Давайте
завершим CompletableFuture значением
12345 и получим его через thenApply:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<Integer> future = new CompletableFuture<>();
CompletableFuture<Integer> res = future.thenApply(n -> n * 2);
future.complete(12345);
System.out.println(res.join());
}
}
Результат выполнения кода:
24690
Смотрите также
-
класс
CompletableFuture,
который представляет асинхронное вычисление -
метод
completeExceptionally,
который завершает будущее исключением -
метод
join,
который ожидает завершения и возвращает результат -
метод
thenApply,
который применяет функцию к результату