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();
}