Sobes.tech
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();
}