Очень интересный и популярный вопрос на собеседованиях. Чем отличаются два интерфейса для реализации задач Runnable и Callable.
http://java67.blogspot.ru/2013/01/difference-between-callable-and-runnable-java.html
http://stackoverflow.com/questions/141284/the-difference-between-the-runnable-and-callable-interfaces-in-java
http://pro-java.ru/java-dlya-opytnyx/interfejsy-callable-i-future-v-java/
Основные различия
- Интерфейс Runnable появиля в Java 1.0, а интерфейс Callable был введен в Java 5.0 в составе библиотеки java.util.concurrent.
- Классы, реализующие интерфейс Runnable должны реализовывать метод run() для выполнения задачи. Классы, реализующие интерфейс Callable должны реализовывать метод call() для выполнения задачи.
- Метод Runnable.run() не возвращает никакого значения, его тип void, а метод Callable.call() может возвращать значение типа T. Интерфейс Callable является параметризированным Callable<T> и тип значения, которое будет возвращаться в методе call() задается этим параметром T.
- Метод run() не может бросить проверяемое исключение, в то время как метод call() может бросить проверяемое исключение.
Пример реализации интерфейсов Runnable и Callable
import java.util.concurrent.Callable; public class RunVsCalEx { public static void main(String[] args) throws Exception { Runnable callback1 = new Runnable() { @Override public void run() { } }; process(callback1); Callable<String> callback2 = new Callable<String>() { @Override public String call() throws Exception { String str = "String from callback"; return str; } }; processString(callback2); } private static void process(Runnable callback) { for (int i = 0; i <= 100; i++) { if (i == 100) { callback.run(); } } } private static void processString(Callable<String> callback) throws Exception { for (int i = 0; i <= 100; i++) { if (i == 100) { callback.call(); } } } }
Источники
http://java67.blogspot.ru/2013/01/difference-between-callable-and-runnable-java.html
http://stackoverflow.com/questions/141284/the-difference-between-the-runnable-and-callable-interfaces-in-java
http://pro-java.ru/java-dlya-opytnyx/interfejsy-callable-i-future-v-java/