Exercicis: Sincronització de fils
Autor: Joan Puigcerver Ibáñez
Correu electrònic: j.puigcerveribanez@edu.gva.es
Llicència: CC BY-NC-SA 4.0
(Reconeixement - NoComercial - CompartirIgual) 🅭
Objectius
Conèixer i implementar programes que sincronitzen l'accés de diferents fils a recursos d'una manera segura.
Tots els exercicis han d'estar situats en el package corresponent.
- Package:
ud2.exericises
- El nom de la classe de cada exercici és el nom.
- El format de la eixida del programa ha de ser consistent
amb el format demanat.
Bizum
- Package:
ud2.exercises.bizum
Volem fer un programa que simule el mon real,
on moltes persones poden realitzar transferències bancàries de manera simultània.
El programa crearà diferents persones, les quals tenen associada un compte bancari.
El compte bancari té un saldo, i permet ingressar o retirar diners.
També permet fer un bizum d'una quantitat a un altre compte bancari.
Cada persona té associada una llista d'amics (que també son de la classe Persona ).
Cada persona triarà un dels seus amics de manera aleatòria i li farà un bizum de 10 euros.
La persona realitzarà 20 bizums o pararà abans si es queda sense diners.
ExtinguishFire
- Package:
ud2.exercises.fire
Volem fer un programa que simule el mon real, on un helicòpter dels bombers ha de carregar aigua
d'una piscina per apagar un foc.
La piscina inicialment està buida, però anirà omplint-se a una velocitat regular (especificada com a paràmetre).
L'helicòpter carregarà aigua de la piscina quan aquesta estiga plena. Si no ho està, esperarà fins que
ho estiga.
Després, l'helicòpter anirà a l'incendi i llançarà l'aigua per apagar-lo.
MySemaphore
- Package:
ud2.exercises.semaphore
Crea una implementació de semàfor que permeta controlar el nombre de fils que poden accedir a un recurs.
El semàfor ha de tindre els següents mètodes:
MySemaphore(int permits) : Constructor que rep el nombre de fils simultanis que poden accedir al recurs.
-
void acquire() : Mètode que permet a un fil accedir al recurs. Si no hi ha permisos disponibles, el fil
ha d'esperar fins que n'hi haja.
Aquest mètode ha d'imprimir per pantalla el fil que ha adquirit el recurs i el nombre de permisos disponibles
en el següent format:
(A/N) Fil X ha adquirit el recurs.
on A és el nombre de fils actuals després d'incorporar el fil actual i N el nombre de permisos disponibles.
-
void release() : Mètode que permet alliberar el recurs. Aquest mètode ha d'imprimir per pantalla el fil
que ha alliberat el recurs i el nombre de permisos disponibles en el següent format:
(A/N) Fil X ha alliberat el recurs.
on A és el nombre de fils actuals després d'alliberar el fil actual i N el nombre de permisos disponibles.
-
int availablePermits() : Mètode que retorna el nombre de permisos disponibles.
int getQueueLength() : Mètode que retorna el nombre de fils que estan esperant per adquirir el recurs.
-
void setPermits(int permits) : Mètode que permet modificar el nombre de permisos disponibles.
En aquest cas, si el nombre de permisos disponibles augmenta, cal deixar passar els fils que estiguen esperant
per adquirir el recurs.
Restaurant
- Package:
ud2.exercises.restaurant
Volem fer un programa que simule el mon real que simule el funcionament d'un restaurant.
Client : Cada client del restaurant serà un fil que demanarà un plat aleatòriament cada un cert temps.
- Ha de ser atès per un cambrer.
- Ha d'esperar a ser atès si no hi ha cap cambrer disponible.
- Ha d'esperar a ser servit per poder demanar un altre plat.
Cambrer : El cambrer serà un fil que realitzarà les següents tasques repetidament:
- Comprovar si hi ha algun client esperant a ser atés.
- Prendre nota de la comanda del client.
- Informar a la cuina de la comanda.
- Portar els plats preparats a la taula del client.
Cuiner : El cuiner serà un fil que realitzarà les següents tasques repetidament:
- Comprovar si hi ha alguna comanda pendent.
- Preparar els plats de la comanda.
- Informar al cambrer que els plats estan preparats.
A la Cuina poden haver:
- Fins a 5 plats preparats.
- Dos
Cuiners preparant plats simultàniament.
|