Что такое Future в Java?

«Что такое Future в Java?» — вопрос из категории Java Core, который задают на 26% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Future — это интерфейс в Java (java.util.concurrent), представляющий отложенный результат асинхронной операции. Он позволяет проверять, завершена ли задача, ожидать её завершения и получать вычисленный результат.

Основные методы:

  • V get() — блокирует текущий поток до завершения задачи и возвращает результат.
  • V get(long timeout, TimeUnit unit) — блокирует поток с ограничением по времени.
  • boolean isDone() — проверяет, завершена ли задача.
  • boolean cancel(boolean mayInterruptIfRunning) — пытается отменить выполнение задачи.

Пример с ExecutorService:

ExecutorService executor = Executors.newSingleThreadExecutor();

Future<Integer> future = executor.submit(() -> {
    Thread.sleep(1000); // Имитация долгой операции
    return 42;
});

// Делаем что-то ещё, пока задача выполняется
System.out.println("Задача выполняется...");

if (!future.isDone()) {
    Integer result = future.get(2, TimeUnit.SECONDS); // Ожидание с таймаутом
    System.out.println("Результат: " + result); // Результат: 42
}
executor.shutdown();

Важные нюансы:

  • Вызов get() без таймаута может привести к бесконечной блокировке.
  • После отмены задачи (cancel(true)) метод get() выбросит CancellationException.
  • Future не предоставляет удобных механизмов для цепочек вызовов или комбинирования результатов.

Современная альтернатива: Начиная с Java 8, для сложных асинхронных сценариев рекомендуется использовать CompletableFuture, который поддерживает неблокирующие комбинации, обработку исключений и ручное завершение.