← Назад к вопросам

Как получить результат Future?

2.0 Middle🔥 221 комментариев
#Многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Получение результата Future

Future в Java представляет результат асинхронного вычисления, который может быть получен несколькими способами.

Основные методы получения результата

1. Метод get() - блокирующий способ

Самый простой и часто используемый способ:

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> "Результат");

try {
    String result = future.get(); // Блокирует до получения результата
    System.out.println(result);
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
} catch (ExecutionException e) {
    System.err.println("Ошибка в вычислении: " + e.getCause());
}

2. Метод get(timeout, unit) - с таймаутом

Позволяет указать максимальное время ожидания:

try {
    String result = future.get(5, TimeUnit.SECONDS);
} catch (TimeoutException e) {
    System.err.println("Превышено время ожидания");
    future.cancel(true); // Отменить задачу
}

3. Проверка наличие результата - isDone()

if (future.isDone()) {
    String result = future.get();
}

Современные подходы (CompletableFuture)

Java 8 и выше предоставляют CompletableFuture с более удобным API:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    return "Результат";
});

// Способ 1: Использование колбэка
future.thenAccept(result -> System.out.println(result));

// Способ 2: Использование thenApply для трансформации
CompletableFuture<Integer> intFuture = future.thenApply(String::length);

// Способ 3: Блокирующее получение
try {
    String result = future.get();
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

// Способ 4: join() - бросает unchecked exception
String result = future.join();

Обработка исключений

future.exceptionally(ex -> {
    System.err.println("Ошибка: " + ex.getMessage());
    return "Значение по умолчанию";
});

// Или handle для обработки обоих случаев
future.handle((result, ex) -> {
    if (ex != null) {
        System.err.println("Ошибка: " + ex.getMessage());
        return "Ошибка";
    }
    return result;
});

Важные замечания

  • get() - блокирует текущий поток, может привести к deadlock
  • join() - аналог get(), но бросает unchecked exception
  • CompletableFuture предпочтительнее Future для новых проектов
  • Всегда обрабатывайте InterruptedException и ExecutionException
  • Используйте таймауты, чтобы избежать бесконечного ожидания
Как получить результат Future? | PrepBro