Junior
¿Cuál es la diferencia entre las interfaces Callable y Runnable?
sobes.tech AI
Respuesta de la IA
Runnable - es una interfaz funcional que representa una tarea que puede ser ejecutada por un hilo. Tiene un método run(), que no acepta argumentos1 y no devuelve valores. Se usa para realizar operaciones en segundo plano que no requieren un resultado.
Callable - es una interfaz parametrizada que también representa una tarea que puede ser ejecutada por un hilo. Tiene un método call(), que devuelve un tipo genérico <V> (un valor arbitrario)2 y puede lanzar una excepción (Exception). Es adecuado para tareas cuyo resultado necesita ser utilizado.
Diferencias principales:
| Característica | Runnable |
Callable |
|---|---|---|
| Valor de retorno | No | Sí (tipo {@code <V>}) |
| Excepciones | No (método {@code run}) | Sí (método {@code call}) |
| Método | {@code void run()} | {@code V call() throws Exception} |
| Uso | {@code java.lang.Runnable} | {@code java.util.concurrent.Callable} |
Ejemplo de uso de Runnable:
// Implementación de Runnable:
Runnable task = new Runnable() {
@Override
public void run() {
// Ejecuta alguna operación sin devolver resultado
System.out.println("Runnable task executed");
}
};
// Ejecutar en un hilo:
new Thread(task).start();
Ejemplo de uso de Callable:
// Implementación de Callable:
Callable<String> task = new Callable<String>() {
@Override
public String call() throws Exception {
// Ejecuta una operación y devuelve un resultado:
return "Callable task executed with result";
}
};
// Ejecutar usando ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);
try {
// Obtener resultado:
String result = future.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}