Метод completeOnTimeout
Метод completeOnTimeout завершает CompletableFuture
указанным значением, если исходный CompletableFuture
не завершился в течение заданного времени ожидания. В первом
параметре мы передаем значение, которым нужно завершить
CompletableFuture, во втором - время ожидания, в третьем -
единицу измерения времени. Метод возвращает новый
CompletableFuture, который завершится либо исходным
результатом, либо переданным значением по истечении таймаута.
Синтаксис
CompletableFuture<T> completeOnTimeout(T value, long timeout, TimeUnit unit)
Пример
Давайте создадим CompletableFuture, который завершится
значением по умолчанию, если не получит результат за 1 секунду:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = new CompletableFuture<>();
CompletableFuture<String> res = future.completeOnTimeout("default", 1, TimeUnit.SECONDS);
System.out.println(res.join());
}
}
Результат выполнения кода:
"default"
Пример
Давайте создадим CompletableFuture, который успеет
завершиться до истечения таймаута, и проверим, что значение
по умолчанию не используется:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "abcde");
CompletableFuture<String> res = future.completeOnTimeout("default", 5, TimeUnit.SECONDS);
System.out.println(res.join());
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте используем completeOnTimeout вместе с
supplyAsync, где задача выполняется дольше таймаута:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try
{
Thread.sleep(2000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return "abcde";
});
CompletableFuture<String> res = future.completeOnTimeout("12345", 1, TimeUnit.SECONDS);
System.out.println(res.join());
}
}
Результат выполнения кода:
"12345"
Смотрите также
-
класс
CompletableFuture,
который представляет асинхронные вычисления -
метод
orTimeout,
который завершает CompletableFuture исключением по таймауту -
метод
complete,
который завершает CompletableFuture значением -
метод
supplyAsync,
который асинхронно возвращает результат