Назад к вопросам
Middle
116
questionbank

Для чего предназначены классы Future и CompletableFuture в Java?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Future представляет результат асинхронной операции, который будет доступен в будущем. Он позволяет проверить статус выполнения, дождаться завершения и получить результат или выбросить исключение.

CompletableFuture расширяет возможности Future, добавляя возможность связывать последовательные и параллельные асинхронные операции, выполнять действия по завершении задачи, обрабатывать исключения и объединять результаты. Он реализует интерфейс CompletionStage.

Основные отличия CompletableFuture от Future:

  • Чейнинг (Chaining): Возможность связывать асинхронные операции.
  • Композиция: Объединение результатов нескольких CompletableFuture.
  • Обработка исключений: Более гибкие механизмы обработки ошибок.
  • Программное завершение: Возможность завершить CompletableFuture вручную.

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

import java.util.concurrent.*;

// ...

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {
    Thread.sleep(1000); // имитация долгой работы
    return "Результат операции Future";
});

try {
    String result = future.get(); // блокирующее получение результата
    System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
} finally {
    executor.shutdown();
}

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

import java.util.concurrent.*;

// ...

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    }
    return "Результат первой операции";
});

CompletableFuture<String> secondFuture = future.thenApplyAsync(result -> {
    System.out.println("Получен результат: " + result);
    return result + ", результат второй операции";
});

secondFuture.thenAccept(finalResult -> {
    System.out.println("Финальный результат: " + finalResult);
});

// Для демонстрации, в реальном приложении используются другие механизмы ожидания или завершения
try {
    Thread.sleep(2000);
} catch (InterruptedException e) {
    e.printStackTrace();
}