Назад к вопросам
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();
}