Práctica de concurrencia de forma profesional: pasamos tareas a
ExecutorService en lugar de crear
Thread manualmente, gestionamos el pool, la cola y el ciclo de vida (
shutdown(),
shutdownNow()). Analizamos la diferencia entre
Runnable y
Callable<T>, obtenemos resultados a través de
Future y sus métodos (
get(),
isDone(),
cancel(...),
isCancelled()). Mostraremos la ejecución de varias tareas,
invokeAll/
invokeAny, el manejo de
ExecutionException y errores típicos.