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