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

Что делает интерфейс Future?

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

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

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

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

Интерфейс Future

Future — это интерфейс из пакета java.util.concurrent, который представляет результат асинхронного вычисления. Он позволяет работать с результатом, который будет готов в будущем, в отдельном потоке или потоковом пуле.

Основная назначение

Future служит для:

  • Получения результата асинхронной операции — не нужно ждать, когда операция завершится в текущем потоке
  • Проверки статуса операции — узнать, завершилась ли она
  • Отмены операции — прервать выполнение, если оно ещё не началось
  • Ожидания результата — заблокировать текущий поток до получения результата

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

public interface Future<V> {
    // Получить результат (блокирующий вызов)
    V get() throws InterruptedException, ExecutionException;
    
    // Получить результат с таймаутом
    V get(long timeout, TimeUnit unit) 
        throws InterruptedException, ExecutionException, TimeoutException;
    
    // Отменить выполнение задачи
    boolean cancel(boolean mayInterruptIfRunning);
    
    // Проверить, отменена ли задача
    boolean isCancelled();
    
    // Проверить, завершена ли задача
    boolean isDone();
}

Практический пример

ExecutorService executor = Executors.newFixedThreadPool(2);

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

// Проверяем статус
if (!future.isDone()) {
    System.out.println("Задача ещё выполняется");
}

// Ожидаем результат с таймаутом
try {
    Integer result = future.get(3, TimeUnit.SECONDS);
    System.out.println("Результат: " + result);
} catch (TimeoutException e) {
    System.out.println("Истекло время ожидания");
    future.cancel(true); // отмена операции
} finally {
    executor.shutdown();
}

Future vs CompletableFuture

Future — это базовый интерфейс для асинхронных операций, но он имеет ограничения:

  • Нет возможности комбинировать несколько Future
  • Нет встроенных callback-ов для обработки результата
  • Блокирующий метод get() — приходится ждать в текущем потоке

Для более мощных возможностей используется CompletableFuture (Java 8+):

CompletableFuture<Integer> cf = CompletableFuture.supplyAsync(() -> 42);

// Трансформация результата
CompletableFuture<String> result = cf
    .thenApply(num -> "Число: " + num)
    .thenApply(String::toUpperCase);

// Обработка результата без блокировки
cf.thenAccept(num -> System.out.println("Готово: " + num));

Когда использовать Future

  • Простые асинхронные операции в потоковом пуле (ExecutorService)
  • Когда нужна возможность отменить задачу
  • Когда нужно проверить статус выполнения
  • Для совместимости со старым кодом (Java < 8)

Для новых проектов рекомендуется использовать CompletableFuture или реактивные библиотеки (RxJava, Project Reactor).