La primera solución puede que sea la más intuitiva, en la segunda respetaremos más las normas de la orientación a objetos.

Necesitamos crear una clase para intercambiar la información; nuestra clase deberá tener una variable para guardar el número, y otra para indicar si ya está generado, y ya ha sido utilizado. Esta podría ser una solución

La clase GeneraNumero.

La clase GeneraNumero, debe estar continuamente generando números, pero deberá comprobar que el numero ya ha sido utilizado, antes de machacarlo; esto lo hacemos poniendo disponible a true cuando esta generado y a false cuando se ha utilizado

Notas:

Esperamos que el área de intercambio, nos lo indiquen desde fuera, y en la línea 10 nos guardamos la referencia pasada.

En 16 tenemos el bucle continuo, si queremos que se acabe después de generar “n”, se puede modificar….

El resto del trabajo, lo hacemos con el buffer sincronizado. Evitamos que a media modificación del buffer, alguien lo pueda coger.

Desde 18 a 26, hacemos que este hilo quede parado (wait()) hasta que el número se haya usado (isDisponible() = falso). Cada vez que le toque trabajar, comprobara el estado, y si sigue disponible=true, volverá a pararse

Cuando disponible=falso, continua, y en las líneas 27 y 28 calcula el siguiente número, y vuelve a marcar que ya está disponible, luego, libera a todos los hilos que están en wait con el notifyAll de la línea 30

Cuando vuelva a 16 para reiniciar el bucle, y llegue hasta 18, se encontrara que disponible esta en true, por lo que empezara a lanzar wait y se quedara esperando

La clase PresentaNumero

Esta clase es semejante a la anterior, con la diferencia que trabaja cuando disponible es true

Sigue la línea de GeneraNumero, esperando hasta que disponible se true, en ese momento, el otro hilo habrá lanzado un notify, por lo que cuando el SO le ceda el control, vera que disponible está a true, avanzara hasta 23, que imprimirá el número que se encuentre en el buffer, y podrá poner disponible a false y lanzar el notify para que el resto de hilos detenidos por wait, puedan continuar

La clase Main

Esta es la más sencilla, porque solo tiene que crear un objeto buffer, los correspondientes GeneraNumero y PresentaNumero, y asignarles el buffer creado, luego instancia los dos Thread y los arranca. Vamos, algo como esto:

La salida vendría a ser:

Acordaros, que como no le hemos puesto ninguna forma de finalizar, deberemos abortarlo

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.