Sobes.tech
Junior

Jaký je rozdíl mezi rozhraními Callable a Runnable?

sobes.tech AI

Odpověď od AI

Runnable - je funkční rozhraní, které představuje úkol, jejž může spustit vlákno. Má metodu run(), která nepřijímá argumenty1 a nevrací žádnou hodnotu. Používá se k provádění operací na pozadí, které nevyžadují výsledek.

Callable - je parametrizované rozhraní, které také představuje úkol, jejž může spustit vlákno. Má metodu call(), která vrací generický typ <V> (libovolnou hodnotu)2 a může vyhodit výjimku (Exception). Je vhodné pro úkoly, jejichž výsledek je třeba použít.

Hlavní rozdíly:

Vlastnost Runnable Callable
Návratová hodnota Ne Ano (typ {@code <V>})
Výjimky Ne (metoda {@code run}) Ano (metoda {@code call})
Metoda {@code void run()} {@code V call() throws Exception}
Použití {@code java.lang.Runnable} {@code java.util.concurrent.Callable}

Příklad použití Runnable:

// Implementace Runnable:
Runnable task = new Runnable() {
    @Override
    public void run() {
        // Provádí operaci bez návratu výsledku
        System.out.println("Runnable úkol proveden");
    }
};

// Spuštění v vlákně:
new Thread(task).start();

Příklad použití Callable:

// Implementace Callable:
Callable<String> task = new Callable<String>() {
    @Override
    public String call() throws Exception {
        // Provádí operaci a vrací výsledek:
        return "Callable úkol proveden s výsledkem";
    }
};

// Spuštění pomocí ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);

try {
    // Získání výsledku:
    String result = future.get();
    System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
} finally {
    executor.shutdown();
}