Что такое Future в Java и как его использовать?

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

Ответ

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

Основное назначение: Позволяет получить результат вычисления, которое ещё не завершено, и контролировать его выполнение.

Ключевые методы:

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

Пример использования с ExecutorService:

ExecutorService executor = Executors.newSingleThreadExecutor();

// Запускаем асинхронную задачу, возвращающую Integer
Future<Integer> future = executor.submit(() -> {
    Thread.sleep(1000); // Имитация долгой операции
    return 42;
});

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

try {
    // Блокируемся и ждём результат (максимум 2 секунды)
    Integer result = future.get(2, TimeUnit.SECONDS);
    System.out.println("Результат: " + result);
} catch (TimeoutException e) {
    System.err.println("Задача выполняется слишком долго");
    future.cancel(true); // Прерываем задачу
}

executor.shutdown();

Эволюция: В современном Java для асинхронного программирования часто используют CompletableFuture (Java 8+), который предоставляет более богатый API: цепочки вызовов, комбинирование задач и неблокирующую обработку результатов.