Главное отличие в том, что Runnable не может вернуть результат и не может выбросить проверяемое исключение, тогда как Callable это может.
Runnable
run(): void run();Exception, кроме RuntimeException).Callable
call(): V call() throws Exception; (где V — тип возвращаемого значения).<V>).ExecutorService и Future для асинхронного выполнения задач и получения их результатов.Импользование в ExecutorService:
Runnable передается в execute(Runnable task) или submit(Runnable task). Метод submit возвращает Future<?>.Callable передается в submit(Callable<T> task). Метод submit возвращает Future<T>.Пример Runnable:
java
Пример Callable:
java