Junior
Qual é a diferença entre as interfaces Callable e Runnable?
sobes.tech IA
Resposta da IA
Runnable - é uma interface funcional que representa uma tarefa que pode ser executada por uma thread. Possui um método run(), que não aceita argumentos1 e não retorna valores. É usado para executar operações em segundo plano que não requerem um resultado.
Callable - é uma interface parametrizada que também representa uma tarefa que pode ser executada por uma thread. Possui um método call(), que retorna um tipo genérico <V> (um valor arbitrário)2 e pode lançar uma exceção (Exception). É adequado para tarefas cujo resultado precisa ser utilizado.
Principais diferenças:
| Característica | Runnable |
Callable |
|---|---|---|
| Valor de retorno | Não | Sim (tipo {@code <V>}) |
| Exceções | Não (método {@code run}) | Sim (método {@code call}) |
| Método | {@code void run()} | {@code V call() throws Exception} |
| Uso | {@code java.lang.Runnable} | {@code java.util.concurrent.Callable} |
Exemplo de uso de Runnable:
// Implementação de Runnable:
Runnable task = new Runnable() {
@Override
public void run() {
// Executa alguma operação sem devolver resultado
System.out.println("Runnable task executed");
}
};
// Executar em uma thread:
new Thread(task).start();
Exemplo de uso de Callable:
// Implementação de Callable:
Callable<String> task = new Callable<String>() {
@Override
public String call() throws Exception {
// Executa uma operação e devolve um resultado:
return "Callable task executed with result";
}
};
// Executar com ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);
try {
// Obter resultado:
String result = future.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}