Ответ
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, который поддерживает неблокирующие комбинации, обработку исключений и ручное завершение.