Метод orTimeout
Метод orTimeout завершает объект CompletableFuture
исключением TimeoutException, если за указанное
время результат так и не был получен. В первом параметре
мы передаем время ожидания, во втором - единицу измерения
времени из перечисления TimeUnit. Метод возвращает
тот же самый объект CompletableFuture, что позволяет
использовать его в цепочке вызовов.
Если исходный CompletableFuture уже завершен к моменту
вызова метода, таймаут не оказывает никакого влияния.
Метод не прерывает выполнение самой задачи - он лишь
переводит объект в состояние завершения с ошибкой, если
задача не успела выдать результат.
Синтаксис
CompletableFuture<T> orTimeout(long timeout, TimeUnit unit)
Пример
Давайте создадим задачу, которая выполняется дольше, чем указанный таймаут, и посмотрим на результат:
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(() -> {
try
{
TimeUnit.SECONDS.sleep(3);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return "abcde";
});
future.orTimeout(1, TimeUnit.SECONDS);
try
{
System.out.println(future.get());
}
catch (Exception e)
{
System.out.println(e.getClass().getSimpleName());
}
}
}
Результат выполнения кода:
"TimeoutException"
Пример
А теперь сделаем так, чтобы задача успела выполниться раньше таймаута:
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(() -> {
try
{
TimeUnit.SECONDS.sleep(1);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return "abcde";
});
future.orTimeout(3, TimeUnit.SECONDS);
System.out.println(future.get());
}
}
Результат выполнения кода:
"abcde"
Пример
Метод возвращает тот же самый объект, поэтому его удобно встраивать в цепочку вызовов:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args) throws Exception
{
String res = CompletableFuture
.supplyAsync(() -> "abcde")
.orTimeout(2, TimeUnit.SECONDS)
.thenApply(s -> s + "12345")
.get();
System.out.println(res);
}
}
Результат выполнения кода:
"abcde12345"
Смотрите также
-
метод
completeOnTimeout,
который возвращает значение по умолчанию при таймауте -
метод
exceptionally,
который обрабатывает исключения -
метод
get,
который возвращает результат вычисления -
класс
CompletableFuture,
который представляет асинхронное вычисление