Ejercicios de concurrencia. Boletín 3.

Anuncio
Ejercicios de concurrencia. Boletín 3.
Ejercicio 1
El problema de los filósofos comensales es un símil de aquellas situaciones informáticas
en la que un conjunto de procesos o hilos que se ejecutan de forma concurrente necesitan
usar en exclusión mutua un conjunto de recursos compartidos.
El problema consiste en un conjunto de filósofos sentados alrededor de una mesa, de forma que cada filósofo tiene ante sí un plato y un tenedor. Los filósofos no hacen en su vida
otra cosa que pensar y, cuando se cansan de pensar, comer. El problema es que, dado que
sólo les sirven espaguetis, y que son bastante torpes, necesitan dos tenedores para poder
comer. Por tanto, cuando un filósofo siente hambre, toma su tenedor y el tenedor del filósofo que tiene a su izquierda, y proceden a comer.
La implementación que de este problema se haga debe impedir que todos y cada uno de
los filósofos pueda obtener un tenedor y quedar a la espera de que el otro quede libre, lo
que dejaría a todos los filósofos en una espera infinita (interbloqueo) que los mataría de
hambre.
Se pretende crear un programa Java que mediante el uso de hilos simule la vida (pensar/comer) de un número arbitrario de filósofos. Se recomienda seguir los siguientes consejos:





Escriba una clase Filosofo de objetos activos. Dicha clase debería tener al menos un método pensar(), un método comer() y su método run(). Los dos
primeros deberían introducir una espera aleatoria para simular el tiempo que los filósofos pasan pensando y comiendo. También sería buena idea que dichos métodos
mostrasen algún mensaje por la salida estándar para poder seguir el funcionamiento del programa. Por su parte, el método run() encapsularía la vida del filósofo.
Cada objeto de la clase filósofo debería tener algún tipo de identificación que debería aparecer en los mensajes que muestre en la salida estándar.
Escriba una clase Tenedor con tan sólo dos métodos, coger() y soltar().
Los objetos Tenedor no deben ser activos. Sería buena idea que ambos métodos
mostrasen mensajes en la salida estándar para facilitar el seguimiento del programa, lo que obligaría a que cada objeto tenga también su propia identificación.
Escriba una clase Mesa que contendrá los N tenedores, y que proporcione a los filósofos algunos servicios útiles como por ejemplo indicarles cuáles son sus tenedores. Por simplicidad, también clase podría ser un objeto de esta clase el responsable
de contener la lógica de la coordinación.
Escriba una clase Camarero que contenga el main() del programa, y que cree la
mesa y los filósofos. Puede que necesite indicarle a cada filósofo cuál es su mesa,
pasándole una referencia a la misma en su constructor.
Para generar una espera aleatoria de entre 0 y N-1 milisegundos, puede usar el siguiente código:
int delay=(int) (Math.random()*N);
Thread.currentThread().sleep(delay); //o bien Thread.sleep(delay)
Descargar