Junior
Kāda ir atšķirība starp interfeisiem Callable un Runnable?
sobes.tech AI
Atbilde no AI
Runnable – tas ir funkcionālais interfeiss, kas pārstāv uzdevumu, kuru var izpildīt plūsma. Tam ir viena metode run(), kura nepieņem argumentus1 un neatgriež vērtības. To izmanto fonu operācijām, kurām nav nepieciešams rezultāts:
Callable – tas ir parametrizēts interfeiss, kas arī pārstāv uzdevumu, kuru var izpildīt plūsma. Tam ir viena metode call(), kas atgriež ģenerisku tipu <V> (brīvā vērtība)2 un var izraisīt izņēmumu (tipa Exception). Tas ir piemērots uzdevumiem, kuru rezultātu nepieciešams izmantot:
Galvenās atšķirības:
| Raksturlielums | Runnable |
Callable |
|---|---|---|
| Atgriežamā vērtība | Nav | Jā (tips {@code <V>}) |
| Izņēmumi | Nav (metode {@code run}) | Jā (metode {@code call}) |
| Metode | {@code void run()} | {@code V call() throws Exception} |
| Lietošana | {@code java.lang.Runnable} | {@code java.util.concurrent.Callable} |
Runnable piemērs:
// Runnable realizācija:
Runnable task = new Runnable() {
@Override
public void run() {
// Veic kādu operāciju bez rezultāta atgriešanas
System.out.println("Runnable uzdevums izpildīts");
}
};
// Sākam plūsmā:
new Thread(task).start();
Callable piemērs:
// Callable realizācija:
Callable<String> task = new Callable<String>() {
@Override
public String call() throws Exception {
// Veic operāciju un atgriež rezultātu:
return "Callable uzdevums izpildīts ar rezultātu";
}
};
// Izpildām ar ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);
try {
// Saņemam rezultātu:
String result = future.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}