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

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

Sobes Copilot

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

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

sobes.tech AI

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

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

  • boolean isDone(): Возвращает true, если задача завершена.
  • V get(): Ожидает завершения задачи и возвращает ее результат. Если задача выбросила исключение, его выбрасывает и этот метод. Блокирующий вызов.
  • V get(long timeout, TimeUnit unit): Ожидает завершения задачи в течение указанного времени и возвращает результат. При таймауте выбрасывает TimeoutException. Блокирующий вызов.
  • boolean cancel(boolean mayInterruptIfRunning): Пытается отменить выполнение задачи. Возвращает false, если задача уже завершена, уже отменена или не может быть отменена по другим причинам.
  • boolean isCancelled(): Возвращает true, если задача была отменена до нормального завершения.

Future обычно возвращается при отправке Callable или Runnable в ExecutorService.

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

import java.util.concurrent.*;

// Пример Callable, который выполняет какую-то работу
public class MyTask implements Callable<String> {

    private final String name;

    public MyTask(String name) {
        this.name = name;
    }

    @Override
    public String call() {
        try {
            TimeUnit.SECONDS.sleep(2); // Имитация долгой работы
            System.out.println("Task \"" + name + "\" finished");
            return "Result of " + name;
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            return "Task \"" + name + "\" interrupted";
        }
    }
}
import java.util.concurrent.*;

public class FutureExample {

    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(2);

        // Отправляем задачу на выполнение и получаем Future
        Future<String> future = executor.submit(new MyTask("Task 1"));

        System.out.println("Task submitted");

        // Проверяем, завершена ли задача
        while (!future.isDone()) {
            System.out.println("Task is not yet done...");
            try {
                TimeUnit.MILLISECONDS.sleep(500);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }

        try {
            // Получаем результат выполнения задачи
            String result = future.get();
            System.out.println("Task completed. Result: " + result);
        } catch (InterruptedException | ExecutionException e) {
            System.err.println("Error executing task: " + e.getMessage());
        } finally {
            executor.shutdown(); // Обязательно завершаем ExecutorService
        }
    }
}

Future является базовым интерфейсом. В Java 8 появился CompletableFuture, который предоставляет более широкие возможности для композиции и обработки асинхронных операций.