Sobes.tech
Junior

Kuo skiriasi Callable ir Runnable sąsajos?

sobes.tech AI

Atsakymas iš AI

Runnable – tai funkcionalusis interfeisas, kuris atstovauja užduotį, kurią gali vykdyti srautas. Jame yra vienas metodas run(), kuris nepriima argumentų1 ir negrąžina reikšmių. Naudojamas foninėms operacijoms, kurioms nereikia rezultato:

Callable – tai parametrizuotas interfeisas, kuris taip pat atstovauja užduotį, kurią gali vykdyti srautas. Jame yra vienas metodas call(), kuris grąžina generinį tipą <V> (atsitiktinė reikšmė)2 ir gali mesti išimtį (tipas Exception). Tinka užduotims, kurių rezultatą reikia naudoti:

Pagrindiniai skirtumai:

Bruožas Runnable Callable
Grąžinamas rezultatas Nėra Taip (tipas {@code <V>})
Išimtys Nėra (metodas {@code run}) Taip (metodas {@code call})
Metodas {@code void run()} {@code V call() throws Exception}
Naudojimas {@code java.lang.Runnable} {@code java.util.concurrent.Callable}

Runnable naudojimo pavyzdys:

// Runnable įgyvendinimas:
Runnable task = new Runnable() {
    @Override
    public void run() {
        // Atlieka operaciją be rezultato grąžinimo
        System.out.println("Runnable užduotis įvykdyta");
    }
};

// Paleidžiame sraute:
new Thread(task).start();

Callable naudojimo pavyzdys:

// Callable įgyvendinimas:
Callable<String> task = new Callable<String>() {
    @Override
    public String call() throws Exception {
        // Atlieka operaciją ir grąžina rezultatą:
        return "Callable užduotis įvykdyta su rezultatu";
    }
};

// Paleidžiame naudodami ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);

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