En Java, el subproceso múltiple permite que las tareas se ejecuten simultáneamente, mejorando el rendimiento y la capacidad de respuesta. Tradicionalmente, los desarrolladores usaban la interfaz Runnable para definir tareas, pero tiene dos limitaciones principales: no puede devolver un resultado y no puede generar excepciones marcadas. Para superar estos, Java introdujo las interfaces Callable y Future en Java 5.
tutorial de selenio
Interfaz invocable
El Interfaz invocable representa una tarea que devuelve un resultado y puede generar una excepción. Es similar a Runnable pero más flexible ya que puede devolver un valor y generar excepciones marcadas.
Javaimport java.util.concurrent.*; public class CallableExample { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Callable<Integer> task = () -> { int sum = 0; for (int i = 1; i <= 5; i++) sum += i; return sum; // returns result }; Future<Integer> future = executor.submit(task); System.out.println('Result: ' + future.get()); executor.shutdown(); } }
Producción
Result: 15
Explicación: Se envía una tarea invocable al ejecutor. Calcula la suma de números del 1 al 5 y devuelve el resultado. El resultado se recupera utilizando Future.get() una vez finalizada la tarea.
Interfaz futura
El Interfaz futura representa el resultado de un cálculo asincrónico. Cuando envía una tarea invocable o ejecutable a un ExecutorService, devuelve un objeto Future.
Javaimport java.util.concurrent.*; public class CallableFutureExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> 10 + 20); try { Integer result = future.get(); // waits but returns instantly System.out.println('Result: ' + result); } catch (Exception e) { e.printStackTrace(); } finally { executor.shutdown(); } } }
Producción
Result: 30
Explicación: ElCallablela tarea calcula10 + 2 and ExecutorService.submit()El método devuelve unFutureobjeto. Usandofuture.get()obtenemos el resultado una vez que se completa el cálculo.
Invocable versus futuro
| Característica | invocable | Futuro |
|---|---|---|
| Objetivo | Representa una tarea que devuelve un resultado. | Representa el resultado de una tarea asincrónica. |
| Tipo de devolución | Devuelve un resultado cuando se ejecuta | Mantiene el resultado devuelto por un Callable |
| Definido en | paquete java.util.concurrente | paquete java.util.concurrente |
| Ejecución | Enviado al servicio ejecutor | Devuelto por ExecutorService.submit() |
| Métodos | Tiene una llamada a un método() | Tiene métodos como get() isDone() cancel() |
| Manejo de excepciones | Puede lanzar excepciones marcadas | Maneja resultados y excepciones después de la ejecución. |
| Uso | Define qué ejecutar | Controls monitorea y recupera el resultado de una tarea. |