РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1083 of 1163 menu

Метод 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,
    который представляет асинхронное вычисление
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить