Corrija la aplicación para que el aviso de resultados se muestre sólo cuando la ejecución de todos los hilos ‘galgo’ haya finalizado. Para esto tenga en cuenta:
a. La acción de iniciar la carrera y mostrar los resultados se realiza a partir de la línea 38 de MainCanodromo.
Nos aparece el resultado del ganador como null, ya que está sacando puntaje antes de que los golgos lleguen a la meta.
b. Puede utilizarse el método join() de la clase Thread para sincronizar el hilo que inicia la carrera, con la finalización de los hilos de los galgos.
El método join() permite que se bloquee el hilo actual hasta que se complete otro.
- Una vez corregido el problema inicial, corra la aplicación varias veces, e identifique las inconsistencias en los resultados de las mismas viendo el ‘ranking’ mostrado en consola (algunas veces podrían salir resultados válidos, pero en otros se pueden presentar dichas inconsistencias). A partir de esto, identifique las regiones críticas () del programa.
La inconsistencia que encontramos es que varios golgos llegaban a la misma posición de llegada, por lo tanto, la llegada viene siendo la región crítica ya que, están entrando más de dos golgos a la misma zona.
- Utilice un mecanismo de sincronización para garantizar que a dichas regiones críticas sólo acceda un hilo a la vez. Verifique los resultados.
Sincronizamos donde se asigna el valor de la ubicación, de forma que en la llegada se realice de manera sincronizada.
- Implemente las funcionalidades de pausa y continuar. Con estas, cuando se haga clic en ‘Stop’, todos los hilos de los galgos deberían dormirse, y cuando se haga clic en ‘Continue’ los mismos deberían despertarse y continuar con la carrera. Diseñe una solución que permita hacer esto utilizando los mecanismos de sincronización con las primitivas de los Locks provistos por el lenguaje (wait y notifyAll).
Utilizamos la variable booleana stop que es la que nos permite saber si esta en pausa o no, de forma que si se va a pausar stop sera true y se pondra a esperar hasta que se reanude el hilo, usando notifyall() al tratarse de varios.