16/01/15 14:10
giocala88
Salve raga, di mio mi sono creato una situazione del tipo: simulare un ristorante che ha un tavolo con n posti e n clienti che arrivano si siedono per 2 sec e poi si alzano e se ne vanno via. Ovviamente se il tavolo è occupato i clienti dovranno attendere prima di sedersi. Ho implementato questo codice per allenarmi sui thread, semaphore, locks e capirne appieno il loro funzionamento e soprattutto capire se ho capito.
Posto il codice:
Main
Persona
Tavolo
Questo codice restituisce un output logico "Attendo, mi siedo, mi alzo, si siede il successivo, ecc..". La mia domanda è: "Utilizzare i locks migliora questo stralcio di codice? Se si come posso fare?".
Sono ben accette guide pratiche, consigli utili su semaphore e locks in Java.
Grazie.
Posto il codice:
Main
public class Main { public static void main(String[] args) { Persona p[] = new Persona[8]; Tavolo t = new Tavolo(); for(int i =0; i <p.length; i++){ p[i] = new Persona(i, t); p[i].start(); } for(int i =0; i <p.length; i++){ try{ p[i] = new Persona(i, t); p[i].join(); } catch(InterruptedException e){} } } }
Persona
public class Persona extends Thread{ Tavolo tavolo; // costruttore public Persona(int i, Tavolo tavolo) { super("Persona_"+i); this.tavolo = tavolo; } @Override public void run() { System.out.println("Sono ["+getName()+"] e sono in coda per il tavolo."); tavolo.Entra(getName()); System.out.println("["+getName()+"] ha preso posto al tavolo e resterà per 2 sec."); try{ Thread.sleep(2000); tavolo.Esce(getName()); System.out.println("["+getName()+"] è uscito. Si è liberato un tavolo."); } catch(InterruptedException e){ System.out.println("ERRORE_"+e); } } }
Tavolo
public class Tavolo { private Semaphore sem; private int capienzaTavolo = 5; private int countPersone; private ReentrantLock sedie; // costruttore public Tavolo() { this.sem = new Semaphore(1, true); this.sedie = new ReentrantLock(); } public void Entra(String nameP) { System.out.println("Sono "+nameP+" e voglio sedermi."); try{ this.sem.acquire(); System.out.println(nameP+" si è seduto."); this.countPersone++; if(this.countPersone == this.capienzaTavolo){ System.out.println("Tutto esaurito."); } } catch(InterruptedException e){} } public void Esce(String nameP) { this.sem.release(); this.countPersone--; System.out.println(nameP+" si alza e se ne va."); } }
Questo codice restituisce un output logico "Attendo, mi siedo, mi alzo, si siede il successivo, ecc..". La mia domanda è: "Utilizzare i locks migliora questo stralcio di codice? Se si come posso fare?".
Sono ben accette guide pratiche, consigli utili su semaphore e locks in Java.
Grazie.
aaa