Sincronizzazione in Java in cucina:

Messaggioda epicurus » 25/04/2005, 16:27

Salve a tutti, ho un grandissimo problema : entro qualche giorno devo consegnare al mio profe un sorgente in Java di un programma concorrente che gestisce una cucina, ma non so neppure da dove iniziare perche` per motivi di salute non ho potuto seguire il corso. Inoltre sono da poco qui (Belfast) con l'erasmus e quindi non conosco molta gente e la lingua non e` certo l'italiano.

Se qualcuno riuscisse a salvarmi inviandomi il codice sorgente gli sarei supergrato. Grazie a tutti in anticipo.

Questo e` il problema:

Pensiamo ad una classe Cuoco. Nel nostro modello, un cuoco aspetta di avere una ordinazione, poi prepara il piatto corrispondente ed attende che il cameriere lo prelevi. Il cuoco 'funziona cosi`: 'Possiamo ipotizzare diversi "funzionamenti" per il cuoco: il cuoco prepara fino ad N piatti in attesa che il cameriere venga a prelevarli. Un cuoco, quindi, ha una coda di input per le ordinazioni, un metodo che trasforma ordinazioni in piatti, ed una coda di uscita per i piatti. Entrambe le code potrebbero avere dimensione finita. Come possiamo strutturare il suo metodo Run() nell'approccio classico?
Innanzitutto, il cuoco dovrà attendere la presenza di una ordinazione nella coda di input. Poi dovrà processare l'ordinazione in qualche modo ed alla fine proverà ad inserirla nella coda di output. Infine tornerà ad attendere una ordinazione, e così via. Le code di input ed output sono elementi passivi (ovvero non possiedono un loro thread di esecuzione), ma i loro metodi vengono eseguiti da thread diversi (il cuoco ed il cameriere).

Inoltre le code di cui sopra dovranno ovviamente avere metodi synchronized (l'aggiunta e la rimozione di elementi devono essere operazioni atomiche) ma certamente synchronized non basta. Pensiamo infatti ad una operazione di prelievo di un elemento: cosa succede se la coda è vuota? Il thread attivo (ad esempio il cuoco) dovrà fermarsi ed aspettare sino a quando qualche altro thread inserirà una richiesta nella coda. Possiamo usare un loop con una chiamata a wait() nel corpo. Analogamente, quando inseriamo un piatto nella coda di input dobbiamo attendere che vi sia posto. In entrambi i casi, synchronized ci aiuta a gestire l'atomicità dell'operazione, ma la sincronizzazione vera e propria è a carico del programmatore, così come la responsabilità di garantire l'assenza di deadlock nel protocollo di sincronizzazione.
epicurus
Starting Member
Starting Member
 
Messaggio: 8 di 16
Iscritto il: 05/09/2003, 11:02

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite