Основное различие между этими интерфейсами в их способности возвращать значения. Метод run() в Runnable возвращает void, то есть не может вернуть никакое значение вызывающему коду. В отличие от этого, метод call() в Callable возвращает обобщённое значение, позволяя тебе получить результаты выполненной задачи.
Ещё одно критическое различие в обработке исключений. Runnable не может выбрасывать проверяемые исключения — любые исключения должны обрабатываться внутри самого метода. Callable же может выбрасывать проверяемые исключения, обеспечивая более гибкое управление ошибками и позволяя исключениям распространяться на вызывающий код.
Вот как различаются сигнатуры методов:
// интерфейс Runnable
public void run()
// интерфейс Callable
public V call() throws Exception
Callable был введён в Java 1.5 как более функциональная альтернатива Runnable. Хотя Runnable по-прежнему широко используется для простых задач типа «запустил и забыл», Callable предпочтителен, когда тебе нужно:
ExecutorService и FutureОба интерфейса служат разным целям в многопоточном программировании, и выбор зависит от того, нужно ли твоей задаче возвращаемое значение и возможность обработки исключений.
Метод run() интерфейса Runnable может возвращать Generic-значение, в то время как метод call() интерфейса Callable ограничен возвратом void.
Новый — ещё не проверен сообществом
Вы