Ответ
Интерфейс Callable<V> предназначен для представления задачи, которая возвращает результат типа V и может выбрасывать проверяемые исключения. Это его ключевое отличие от Runnable.
Сигнатура:
public interface Callable<V> {
V call() throws Exception;
}
Пример использования с ExecutorService:
import java.util.concurrent.*;
public class CallableExample {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
// Создаем Callable, который возвращает String
Callable<String> task = () -> {
Thread.sleep(500);
return "Результат вычисления: " + (10 * 10);
};
// Отправляем задачу на выполнение. submit() возвращает Future<String>
Future<String> future = executor.submit(task);
// Получаем результат (get() блокирует поток, пока задача не завершится)
String result = future.get();
System.out.println(result); // Результат вычисления: 100
executor.shutdown();
}
}
| Сравнение с Runnable: | Особенность | Runnable |
Callable<V> |
|---|---|---|---|
| Возвращаемое значение | void |
V (любой тип) |
|
| Исключения | Не может выбрасывать проверяемые исключения | Может выбрасывать Exception |
|
| Метод | run() |
call() |
|
Использование с ExecutorService |
execute() или submit() (возвращает Future<?>) |
submit() (возвращает Future<V>) |
Callable — основа для возврата результатов из асинхронных задач в Java Concurrency API.