Oppure

Loading
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
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?". 8-|

Sono ben accette guide pratiche, consigli utili su semaphore e locks in Java.
Grazie.
aaa