Получение результата 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", затем дождитесь того же
объекта и выведите значение.