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;
}
}