Sobes.tech
Junior

Qual è la differenza tra le interfacce Callable e Runnable?

sobes.tech AI

Risposta dell'AI

Runnable - è un'interfaccia funzionale che rappresenta un compito che può essere eseguito da un thread. Ha un metodo run(), che non accetta argomenti1 e non restituisce valori. Viene utilizzato per eseguire operazioni in background che non richiedono un risultato.

Callable - è un'interfaccia parametrizzata che rappresenta anch'essa un compito che può essere eseguito da un thread. Ha un metodo call(), che restituisce un tipo generico <V> (valore arbitrario)2 e può sollevare un'eccezione (Exception). È adatto per compiti il cui risultato deve essere utilizzato.

Principali differenze:

Caratteristica Runnable Callable
Valore di ritorno No Sì (tipo {@code <V>})
Eccezioni No (metodo {@code run}) Sì (metodo {@code call})
Metodo {@code void run()} {@code V call() throws Exception}
Utilizzo {@code java.lang.Runnable} {@code java.util.concurrent.Callable}

Esempio di utilizzo di Runnable:

// Implementazione di Runnable:
Runnable task = new Runnable() {
    @Override
    public void run() {
        // Esegue qualche operazione senza restituzione di risultato
        System.out.println("Runnable task eseguito");
    }
};

// Esecuzione in un thread:
new Thread(task).start();

Esempio di utilizzo di Callable:

// Implementazione di Callable:
Callable<String> task = new Callable<String>() {
    @Override
    public String call() throws Exception {
        // Esegue un'operazione e restituisce un risultato:
        return "Callable task eseguito con risultato";
    }
};

// Esecuzione con ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);

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