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

Что такое интерфейс Callable в Java?

Sobes Copilot

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

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

sobes.tech AI

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

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

Признак Runnable Callable
Возвращаемое значение void Generic тип V
Исключения Не может выбрасывать checked исключения (только RuntimeException) Может выбрасывать checked исключения
Метод run() call()

Метод call() интерфейса Callable имеет сигнатуру:

// Возвращает результат типа V
// Может выбросить исключение типа Exception
V call() throws Exception;

Для выполнения задачи, реализованной интерфейсом Callable, обычно используется ExecutorService. Результат выполнения можно получить с помощью объекта Future, который возвращается методами submit() класса ExecutorService.

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

// Пример Callable, который суммирует два числа
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;

public class SumCallable implements Callable<Integer> {

    private final int a;
    private final int b;

    public SumCallable(int a, int int b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public Integer call() throws Exception {
        // Выполнение задачи
        return a + b;
    }

    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();

        // Создание экземпляра Callable
        Callable<Integer> task = new SumCallable(5, 3);

        // Отправка задачи на выполнение и получение Future
        Future<Integer> future = executor.submit(task);

        // Получение результата (блокирующая операция)
        int result = future.get();

        System.out.println("Результат: " + result); // Вывод: Результат: 8

        executor.shutdown();
    }
}

Callable предоставляет более гибкий механизм выполнения задач по сравнению с Runnable, особенно когда требуется получить результат выполнения или обработать специфические исключения.