Sobes.tech
Junior

Mis vahe on liidestel Callable ja Runnable?

sobes.tech AI

Vastus AI-lt

Runnable – see funktsionaalne liides, mis esindab ülesannet, mida saab täita voog. Sellel on üks meetod run(), mis ei võta argumente1 ja ei tagasta väärtusi. Kasutatakse taustategevuste jaoks, mille tulem ei ole vajalik:

Callable – see on parameetriseeritud liides, mis samuti esindab ülesannet, mida saab täita voog. Sellel on üks meetod call(), mis tagastab genrik-tüübi <V> (valikuline väärtus)2 ja võib visata erandi (tüüp Exception). Sobib ülesannetele, mille tulemust on vaja kasutada:

Peamised erinevused:

Tunnus Runnable Callable
Tagastatav väärtus Ei ole Jah (tüüp {@code <V>})
Erandid Ei ole (meetod {@code run}) Jah (meetod {@code call})
Meetod {@code void run()} {@code V call() throws Exception}
Kasutus {@code java.lang.Runnable} {@code java.util.concurrent.Callable}

Runnable näide:

// Runnable teostus:
Runnable task = new Runnable() {
    @Override
    public void run() {
        // Teostame mingi operatsiooni ilma tulemuse tagastamiseta
        System.out.println("Runnable ülesanne täidetud");
    }
};

// Käivitame voos:
new Thread(task).start();

Callable näide:

// Callable teostus:
Callable<String> task = new Callable<String>() {
    @Override
    public String call() throws Exception {
        // Teostame operatsiooni ja tagastame tulemuse:
        return "Callable ülesanne täidetud tulemusega";
    }
};

// Käivitame ExecutorService abil:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);

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