Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jvSpCfRsl 183 of 322 menu
◀ ▶

Получение результата CompletableFuture в Java

Пока CompletableFuture не завершён, вызов get останавливает текущий поток. После успеха метод возвращает значение; при сбое бросает проверяемое ExecutionException с исходной причиной внутри. Перегрузка с Duration ограничивает ожидание и может бросить TimeoutException.

Метод join ведёт себя как get, но оборачивает сбой в CompletionException без объявления throws. Его удобно вызывать в main и в цепочках, где исключение всё равно обработает exceptionally.

Проверка без долгого ожидания:

import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; public class Main { public static void main(String[] args) throws Exception { CompletableFuture<String> slow = CompletableFuture.supplyAsync(() -> { try { TimeUnit.MILLISECONDS.sleep(200); } catch (InterruptedException ex) { Thread.currentThread().interrupt(); } return "ready"; }); System.out.println(slow.isDone()); System.out.println(slow.getNow("waiting")); System.out.println(slow.join()); } }

Сразу после старта isDone ложен, getNow отдаёт запасное "waiting". После завершения join печатает "ready".

Методы get и join не отменяют задачу. Если нужно прервать вычисление, используют cancel или кооперативное прерывание внутри Supplier через флаг или Thread.interrupted().

Создайте supplyAsync с задержкой 100 мс и получите результат с таймаутом 50 мс. Поймайте TimeoutException и выведите "late", затем дождитесь того же объекта и выведите значение.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить