Назад к вопросам
Junior
78
questionbank

В чем отличие между интерфейсами Callable и Runnable?

Sobes Copilot

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

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

sobes.tech AI

Runnable - это функциональный интерфейс, представляющий задачу, которая может быть выполнена потоком. Он имеет один метод run(), который не принимает аргументов1 и не возвращает значения. Используется для выполнения фоновых операций, не требующих результата.

Callable - это параметризованный интерфейс, представляющий задачу, которая также может быть выполнена потоком. Он имеет один метод call(), который возвращает дженерик-тип <V> (произвольное значение)2 и может выбрасывать исключение (типа Exception). Подходит для задач, результат которых необходимо использовать.

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

Признак Runnable Callable
Возвращаемое значение Нет Да (тип {@code <V>})
Исключения Нет (метод {@code run}) Да (метод {@code call})
Метод {@code void run()} {@code V call() throws Exception}
Использование {@code java.lang.Runnable} {@code java.util.concurrent.Callable}

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

// Реализация Runnable:
Runnable task = new Runnable() {
    @Override
    public void run() {
        // Выполняем какую-то операцию без возврата результата
        System.out.println("Runnable task executed");
    }
};

// Запускаем в потоке:
new Thread(task).start();

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

// Реализация Callable:
Callable<String> task = new Callable<String>() {
    @Override
    public String call() throws Exception {
        // Выполняем операцию и возвращаем результат:
        return "Callable task executed with result";
    }
};

// Запускаем с помощью ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);

try {
    // Получаем результат:
    String result = future.get();
    System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
} finally {
    executor.shutdown();
}