Junior
Каква е разликата между интерфейсите Callable и Runnable?
sobes.tech AI
Отговор от 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 задача изпълнена");
}
};
// Стартиране в нишка:
new Thread(task).start();
Пример за използване на Callable:
// Реализация на Callable:
Callable<String> task = new Callable<String>() {
@Override
public String call() throws Exception {
// Изпълнява операция и връща резултат:
return "Callable задача изпълнена с резултат";
}
};
// Изпълнение чрез 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();
}