Saltearse al contenido

Comunicación entre hilos

Introducción

Como vimos hasta ahora, la programación con multithreading es una técnica poderosa que permite ejecutar múltiples tareas de forma concurrente dentro de un programa. Sin embargo, con este poder viene la responsabilidad de coordinar eficazmente estas tareas paralelas. Aquí es donde entra en juego la comunicación entre hilos. En esta lección, aprenderemos cómo los hilos pueden comunicarse entre sí y cómo podemos implementar esta comunicación en Java.

En los primeros días de la programación concurrente, se utilizaban ciclos de sondeo (polling) para verificar si una condición específica se había cumplido. Este enfoque, aunque funcional, desperdiciaba ciclos de CPU y no era eficiente. Java introdujo un mecanismo más elegante para la comunicación entre procesos a través de los métodos wait(), notify() y notifyAll().

Estos métodos, implementados como métodos finales en la clase Object, están disponibles para todas las clases en Java. Aunque conceptualmente avanzados desde una perspectiva de la programación, las reglas para su uso son bastante simples:

  • wait(): Le dice al hilo que lo llama que libere el monitor y se duerma hasta que otro hilo entre en el mismo monitor y llame a notify() o notifyAll().
  • notify(): Despierta un hilo que llamó a wait() en el mismo objeto.
  • notifyAll(): Despierta todos los hilos que llamaron a wait() en el mismo objeto. Uno de los hilos obtendrá acceso.

Es importante señalar que, aunque wait() normalmente espera hasta que se llame a notify() o notifyAll(), existe la posibilidad de que en casos muy raros el hilo en espera pueda despertarse debido a un “despertar espurio”, esto es, el hilo se despierta aunque no haya recibido una señal para hacerlo. Por esta razón, Oracle recomienda que las llamadas a wait() se realicen dentro de un ciclo que verifique la condición por la que el hilo está esperando.