Salta el contingut
 

Exercicis: Sincronització de fils

Joan Puigcerver Ibáñez

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.exercises.
  • Nom de la classe: el nom de cada exercici.
  • Format de l'eixida: ha de ser consistent amb el format demanat.

Bizum

  • Package: ud2.exercises.bizum.

Crea un programa que simule el món real, on moltes persones poden realitzar transferències bancàries de manera simultània.

El programa ha de crear diferents persones, cadascuna amb 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'amistats (que també són de la classe Persona). A més, cada persona ha de triar una de les seues amistats de manera aleatòria i fer-li un bizum de 10 €. La persona realitza 20 bizums, o para abans si es queda sense diners.

ExtinguishFire

  • Package: ud2.exercises.fire.

Crea un programa que simule el món real, on un helicòpter dels bombers ha de carregar aigua d'una piscina per apagar un foc.

La piscina està inicialment buida, però es va omplint a una velocitat regular (especificada com a paràmetre). L'helicòpter carrega aigua de la piscina quan aquesta està plena; si no ho està, espera fins que ho estiga. Després, l'helicòpter va a l'incendi i llança 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 mètodes següents:

  • MySemaphore(int permits): constructor que rep el nombre de fils simultanis que poden accedir al recurs.
  • void acquire(): permet a un fil accedir al recurs. Si no hi ha permisos disponibles, el fil ha d'esperar fins que n'hi haja.

    Ha d'imprimir per pantalla el fil que ha adquirit el recurs i el nombre de permisos disponibles en el format següent, on A és el nombre de fils actuals després d'incorporar el fil actual i N, el nombre de permisos disponibles:

    (A/N) Fil X ha adquirit el recurs.
    
  • void release(): permet alliberar el recurs. Ha d'imprimir per pantalla el fil que ha alliberat el recurs i el nombre de permisos disponibles en el format següent, on A és el nombre de fils actuals després d'alliberar el fil actual i N, el nombre de permisos disponibles:

    (A/N) Fil X ha alliberat el recurs.
    
  • int availablePermits(): retorna el nombre de permisos disponibles.

  • int getQueueLength(): retorna el nombre de fils que estan esperant per adquirir el recurs.
  • void setPermits(int permits): permet modificar el nombre de permisos disponibles. Si aquest nombre augmenta, cal deixar passar els fils que estiguen esperant per adquirir el recurs.

Restaurant

  • Package: ud2.exercises.restaurant.

Crea un programa que simule el funcionament d'un restaurant amb els elements següents:

  • Client: cada client del restaurant és un fil que demana un plat aleatòriament cada cert temps.
    • Ha de ser atés per una persona cambrera.
    • Ha d'esperar a ser atés si no hi ha cap cambrera disponible.
    • Ha d'esperar a ser servit per poder demanar un altre plat.
  • Cambrer: és un fil que realitza repetidament les tasques següents:
    • Comprovar si hi ha algun client esperant a ser atés.
    • Prendre nota de la comanda del client.
    • Informar la cuina de la comanda.
    • Portar els plats preparats a la taula del client.
  • Cuiner: és un fil que realitza repetidament les tasques següents:
    • Comprovar si hi ha alguna comanda pendent.
    • Preparar els plats de la comanda.
    • Informar la persona cambrera que els plats estan preparats.

A la Cuina pot haver-hi:

  • Fins a 5 plats preparats.
  • Dos Cuiner preparant plats simultàniament.
📌 Aquest document pot quedar desactualitzat després d’imprimir-lo. Pots consultar la versió més recent a la pàgina web.
🌿 Abans d’imprimir aquest document, considera si és realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.