Historia de la cuestión:
En Java, el soporte para la multihilo se ha implementado desde el principio. Los hilos permiten ejecutar varias tareas en paralelo, utilizando eficazmente los procesadores multinúcleo. La JVM proporciona una capa de abstracción sobre los hilos del sistema operativo.
Problema:
La creación, gestión y finalización de hilos requiere una comprensión clara de su ciclo de vida, sincronización y posibles condiciones de carrera. El uso imprudente de hilos puede llevar a deadlocks, accesos incorrectos a recursos y registros de errores complicados.
Solución:
En Java, los hilos se pueden crear extendiendo la clase Thread o implementando la interfaz Runnable, así como mediante herramientas modernas como ExecutorService. Es importante finalizar correctamente los hilos, gestionar su ciclo de vida y sincronizar el acceso a datos compartidos.
Ejemplo de creación y finalización de un hilo:
class MyRunnable implements Runnable { public void run() { System.out.println("El hilo está en ejecución"); } } public class ThreadExample { public static void main(String[] args) { Thread t = new Thread(new MyRunnable()); t.start(); // inicia el hilo try { t.join(); // espera a que finalice } catch (InterruptedException e) { e.printStackTrace(); } } }
Características clave:
start(), no run() (de lo contrario, no habrá paralelismo real)join()IllegalThreadStateException¿Se puede reiniciar un hilo después de que ha terminado?
No. Después de finalizar, el hilo se considera "muerto", una segunda llamada a start() resultará en IllegalThreadStateException.
¿Cuál es la diferencia entre llamar a t.run() y t.start()?
t.run() simplemente llamará al método run en el hilo actual, sin crear un nuevo hilo de ejecución. Solo t.start() crea un hilo separado del sistema operativo.
¿Qué sucede si un hilo termina con una excepción no controlada?
Si se lanza una excepción no controlada, el hilo finalizará de forma abrupta, su traza de pila se enviará al flujo de errores, otros hilos no se verán afectados.
run() en lugar de start()InterruptedException)Un programador inicia un hilo mediante el método run(), pensando que se ejecuta en paralelo con el main, pero en realidad todo se ejecuta de forma secuencial.
Pros:
Contras:
Uso correcto de start(), manejo adecuado de excepciones, uso de join() para esperar la finalización de los hilos.
Pros:
Contras: