Buonasera.
Sono una "new entry" del forum e sto sviluppando questo applicativo che simula la gestione di uno sportello postale.
La proposta di lavoro,assegnata dalla mia professoressa di informatica,consiste nel simulare uno sportello postale con uno sportello e due punti di prenotazione tramite l'ambiente di programmazione NetBeans e l'uso della programmazione multithreading.
Il progetto che ho cominciato a sviluppare è diviso in 6 classi:una per il main(UsoSportelloPostale),una che gestisce la struttura dati coda(CodaS),una che gestisce il singolo Nodo della coda(NodoS),una che simula l'utente tramite l'implementazione dell'interfaccia Runnable(Utente) insieme a quella Cassiere che simula il cassiere o impiegato,e quella Contatore che tiene conto degli utenti che vengono serviti.
Vi propongo quello che ho sviluppato,premetto che non ho ben chiaro di come muovermi,sono aperto a inevitabili correzioni,e proposte di modifiche o miglioramenti,anche per completare visto che mi rendo conto che mancano alcune parti soprattutto nel programma chiamante. Grazie
codice:
package usosportellopostale;
public class UsoSportelloPostale {
    public static void main(String[] args) {
        CodaS prenotazione=new CodaS();
        Runnable cas=new Cassiere(prenotazione);
        Thread th_1=new Thread(cas);
        Contatore c=new Contatore();
        Runnable utente=new Utente(prenotazione,c);
        Thread th_2=new Thread();
        //Utente u1=new Utente();
        System.out.println("Sportello Aperto:");
        th_1.start();
        th_2.start();
     }
}
codice:
package usosportellopostale;
public class CodaS {
    private NodoS inizio,fine;
    public CodaS()
    {
        inizio=null;
        fine=null;
    }
    public boolean isEmpty()
    {
        return inizio==null;
    }
    public synchronized int top()
    {
        int ele;
        if(inizio!=null)
        {
            ele=inizio.dato;
        }
        else
        {
            ele=-1;
        }
        return ele;
    }
    public synchronized void enqueue(int v)
    {
        NodoS x=new NodoS(v);
        if(!this.isEmpty())
        {
            fine.next=x;
            fine=fine.next;
        }
        else
        {
            inizio=x;
            fine=x;
        }
    }
    public synchronized void dequeue()
    {
        if(inizio!=null)
        {
            inizio=inizio.next;
        }
        else
        {
            fine=null;
        }
    }
    public Object clone()
    {
        try
        {
            CodaS a=(CodaS)super.clone();
            if(inizio==null)
            {
                a.inizio=null;
                a.fine=null;
            }
            else
            {
                a.inizio=new NodoS(inizio.dato,null);
                a.fine=a.inizio;
                NodoS app,prec;
                prec=a.inizio;
                app=inizio.next;
                while(app!=null)
                {
                    prec.next=new NodoS(app.dato,null);
                    prec=prec.next;
                    app=app.next;
                }
                a.fine=prec;
            }
            return a;
        }catch(CloneNotSupportedException e){
            return null;
        }
}
}
codice:
package usosportellopostale;
public class NodoS {
    public int dato;
    public NodoS next;
    public NodoS(int v)
    {
        dato=v;
        next=null;
    }
    public NodoS(int v,NodoS l)
    {
        dato=v;
        next=l;
    }
}
codice:
package usosportellopostale;
public class Utente implements Runnable{
    private CodaS coda;
    private int time;
    public Contatore conta;
    public Utente(CodaS p,Contatore c)
    {
        coda=p;
        conta=c;
        this.time= (int)(Math.random()*10000)+1000;
    }
    public void run()
    {
      for(;conta.getc()<=10;)  
      {
          try{
          Thread.sleep(time);
          System.out.println("Il cliente "+conta.getc()+" e'entrato nell'ufficio postale");
          coda.enqueue(conta.getc());
          System.out.println("L'utente "+conta.getc()+"si è prenotato");
          }catch(InterruptedException e){}
      }
    }
    public Utente getUtente()
    {
        return this;
    }
}
codice:
package usosportellopostale;
public class Cassiere implements Runnable{
    private CodaS coda;
    public Cassiere(CodaS prenotazione)
    {
        this.coda=prenotazione;
    }
    public void run()
    {
        System.out.println("Cassiere in attesa");
        try{
            while(!coda.isEmpty())
            {
               System.out.println("IL cassiere sta servendo l'utente "+coda.top());
               coda.dequeue();
               Thread.sleep(1500);
            }
        }
        catch(InterruptedException e){          
        }  
    }
}
codice:
package usosportellopostale;
public class Contatore {
    private int conta;
    public Contatore()
    {
        conta=0;
    }
    public synchronized int inc()
    {
        return conta++;
    }
    public synchronized int getc()
    {
        return this.conta;
    } 
}