Sobes.tech
Junior

Aký je rozdiel medzi rozhraniami Callable a Runnable?

sobes.tech AI

Odpoveď od AI

Runnable - je funkčné rozhranie, ktoré predstavuje úlohu, ktorú môže spustiť vlákno. Má metódu run(), ktorá neprijíma argumenty1 a nevracia hodnotu. Používa sa na vykonávanie operácií na pozadí, ktoré nevyžadujú výsledok.

Callable - je parametrizované rozhranie, ktoré tiež predstavuje úlohu, ktorú môže spustiť vlákno. Má metódu call(), ktorá vracia generický typ <V> (ľubovoľnú hodnotu)2 a môže vyhodiť výnimku (Exception). Je vhodné pre úlohy, ktorých výsledok je potrebné použiť.

Hlavné rozdiely:

Vlastnosť Runnable Callable
Návratová hodnota Nie Áno (typ {@code <V>})
Výnimky Nie (metóda {@code run}) Áno (metóda {@code call})
Metóda {@code void run()} {@code V call() throws Exception}
Použitie {@code java.lang.Runnable} {@code java.util.concurrent.Callable}

Príklad použitia Runnable:

// Implementácia Runnable:
Runnable task = new Runnable() {
    @Override
    public void run() {
        // Vykonáva operáciu bez návratu výsledku
        System.out.println("Runnable úloha vykonaná");
    }
};

// Spustenie v vlákne:
new Thread(task).start();

Príklad použitia Callable:

// Implementácia Callable:
Callable<String> task = new Callable<String>() {
    @Override
    public String call() throws Exception {
        // Vykonáva operáciu a vracia výsledok:
        return "Callable úloha vykonaná s výsledkom";
    }
};

// Spustenie pomocou ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);

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