Sobes.tech
Junior

Jaka jest różnica między interfejsami Callable i Runnable?

sobes.tech AI

Odpowiedź od AI

Runnable - to funkcjonalny interfejs reprezentujący zadanie, które może być wykonane przez wątek. Posiada metodę run(), która nie przyjmuje argumentów1 i nie zwraca wartości. Używany jest do wykonywania operacji w tle, które nie wymagają wyniku.

Callable - to sparametryzowany interfejs, który również reprezentuje zadanie, które może być wykonane przez wątek. Posiada metodę call(), która zwraca typ generyczny <V> (dowolną wartość)2 i może rzucać wyjątek (Exception). Nadaje się do zadań, których wynik musi być użyty.

Główne różnice:

Cecha Runnable Callable
Wartość zwracana Nie Tak (typ {@code <V>})
Wyjątki Nie (metoda {@code run}) Tak (metoda {@code call})
Metoda {@code void run()} {@code V call() throws Exception}
Użycie {@code java.lang.Runnable} {@code java.util.concurrent.Callable}

Przykład użycia Runnable:

// Implementacja Runnable:
Runnable task = new Runnable() {
    @Override
    public void run() {
        // Wykonuje jakąś operację bez zwracania wyniku
        System.out.println("Zadanie Runnable wykonane");
    }
};

// Uruchom w wątku:
new Thread(task).start();

Przykład użycia Callable:

// Implementacja Callable:
Callable<String> task = new Callable<String>() {
    @Override
    public String call() throws Exception {
        // Wykonuje operację i zwraca wynik:
        return "Zadanie Callable wykonane z wynikiem";
    }
};

// Uruchom za pomocą ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);

try {
    // Pobierz wynik:
    String result = future.get();
    System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
} finally {
    executor.shutdown();
}