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