Sobes.tech
Middle
546

Qual é a diferença entre as interfaces Runnable e Callable em Java?

Resposta da IA

sobes.tech IA

A principal diferença é que Runnable não pode devolver um resultado nem lançar uma exceção verificada, enquanto que Callable pode.

Runnable

  • Método run(): void run();
  • Não devolve valor.
  • Não pode lançar uma exceção verificada (aquelas que herdam de Exception, exceto RuntimeException).
  • Adequado para tarefas que simplesmente são executadas sem devolver um resultado.

Callable

  • Método call(): V call() throws Exception; (onde V é o tipo de valor devolvido).
  • Devolve um valor (o tipo é especificado em <V>).
  • Pode lançar uma exceção verificada.
  • Frequentemente usado com ExecutorService e Future para execução assíncrona de tarefas e obtenção dos seus resultados.

Utilização em ExecutorService:

  • Runnable é passado para execute(Runnable task) ou submit(Runnable task). O método submit devolve um Future<?>.
  • Callable é passado para submit(Callable<T> task). O método submit devolve um Future<T>.

Exemplo de Runnable:

// Exemplo Runnable
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Tarefa Runnable a correr...");
    }
}

Exemplo de Callable:

// Exemplo Callable
import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println("Tarefa Callable a correr...");
        return "Tarefa concluída";
    }
}