Contenido verificado asociado a este RA
Introducción a la Concurrencia y Fundamentos de Hilos
Esta unidad explora la necesidad de la programación concurrente, diferenciando procesos de hilos. Se cubren los conceptos básicos para identificar cuándo y por qué utilizar hilos, así como los mecanismos fundamentales para su creación, inicio y finalización.
Programación de Aplicaciones con Varios Hilos en Java
Esta unidad se centra en programar aplicaciones Java formadas por varios hilos de ejecución que trabajan de forma concurrente. Se retoman las técnicas de creación de hilos (extends Thread, implements Runnable) para construir un programa completo con varias tareas independientes, se muestra cómo iniciarlas y coordinarlas con join(), y se introduce ExecutorService como alternativa profesional. Como apoyo para entender el comportamiento del programa, se repasan brevemente los estados por los que pasa un hilo durante su ejecución.
Compartición de Información y Sincronización de Hilos
Esta unidad aborda los desafíos de la compartición de datos entre hilos y la necesidad de sincronización. Se explican los problemas de concurrencia como las condiciones de carrera y se presentan mecanismos para compartir información de forma segura y sincronizar la ejecución de hilos.
Prioridades, Pools de Hilos y Depuración de Aplicaciones Concurrentes
Esta unidad cubre la gestión de prioridades de hilos, el uso de pools de hilos para optimizar recursos y las técnicas esenciales para depurar y documentar aplicaciones concurrentes, asegurando su robustez y mantenibilidad.
Conceptos clave
ConcurrenciaParalelismoProcesoHilo (Thread)Método run()Método start()Interfaz RunnableClase ThreadRunnable vs Thread en una aplicación multihiloConcurrencia de tareas independientesThread.start() y Thread.join()ExecutorService y pools de hilosEstados del hilo como apoyo conceptualInterruptedException y terminación ordenadaVariables compartidasCondición de carreraSección críticaSincronización
Errores que conviene evitar
- **Llamar a `run()` en lugar de `start()`:** Causa que el código de la tarea se ejecute en el hilo principal en lugar de en un nuevo hilo, anulando el propósito de la concurrencia. **Corrección:** Siempre usar `start()` para iniciar un nuevo hilo de ejecución.
- **Confundir proceso con hilo:** Lleva a malentendidos sobre la compartición de recursos y la comunicación. **Corrección:** Recordar que los hilos comparten memoria dentro de un proceso, mientras que los procesos tienen memoria aislada.
- **Confundir invocar run() con start():** llamar directamente a run() ejecuta el código en el mismo hilo, sin crear concurrencia real. Corrección: siempre usar start() para que el hilo se ejecute de forma independiente.
- **No usar join() cuando el resultado de un hilo es necesario después:** el hilo principal puede continuar antes de que la tarea concurrente haya terminado, produciendo resultados incompletos. Corrección: llamar a join() sobre cada hilo cuyo resultado sea necesario antes de continuar.
- **Ignorar InterruptedException:** capturarla sin restablecer la bandera de interrupción impide que el hilo termine de forma controlada. Corrección: llamar a Thread.currentThread().interrupt() y salir del método run() o de la tarea.
- **No sincronizar el acceso a datos compartidos:** Causa condiciones de carrera y datos inconsistentes. **Corrección:** Identificar todas las variables compartidas y proteger su acceso con `synchronized` o `Lock`.
- **Deadlock por orden de bloqueos:** Dos hilos intentan adquirir dos bloqueos en órdenes opuestos. **Corrección:** Establecer un orden global para la adquisición de bloqueos y seguirlo consistentemente en todos los hilos.
- **Llamar a `wait()`, `notify()` o `notifyAll()` fuera de un bloque `synchronized`:** Lanza `IllegalMonitorStateException`. **Corrección:** Asegurarse de que estas llamadas se realicen siempre dentro de un bloque o método `synchronized` sobre el objeto cuyo bloqueo se está utilizando.