Ciao a tutti, di seguito posto un po' di codice di un progetto che dovrebbe simulare un sistema di stazioni ferroviarie, in cui tra 2 stazioni c'e' un solo binario non percorribile in andata e ritorno contemporaneamente, ma da una stazione puo' partire un treno su un binario mentre contemporaneamente ne arriva uno su un altro.
Quello che vi chiedo e' se potete dare un'occhiata se ho gestito bene la sincronizzazione.
Non chiedetevi il senso del progetto, e' per un esame universitario...
codice:
//metodo run classe Treno, il thread
public void run(){
try{
while(listaPasseggeri.size() > 0){
stampaListaPasseggeri();
partenza.prendiBinario(arrivo, this);
System.out.println("Treno "+getName()+" partito");
partenza.liberaBinario(arrivo);
arrivo.trenoArrivato(this);
}
}
catch(Exception e){
}
}
//METODI DI STAZIONE FERROVIARIA
//I METODI PRINCIPALI USATI DA TRENO
//metodo che avverte una stazione che un treno e' arrivato
public void trenoArrivato(Treno t){
synchronized(listaTreni){
System.out.println("Treno "+ t.getName()+" arrivato alla stazione "+Nome);
listaTreni.add(t);//aggiunge il treno arrivato alla lista dei treni della stazione
passeggeriEntranti(t.listaPasseggeri);//aggiorna la lista dei passeggeri della stazione
t.listaPasseggeri.clear();//svuota la lista dei pass del treno
t.setArrivo(null);//imposta stazione di arrivo del treno
t.setPartenza(this);//imposta stazione di partenza del treno
smistaPasseggeri();//riassegna i passeggeri ai treni sfruttando quelli arrivati o creandone di nuovi
try {
t.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//occupa il binario giusto dalla stazione di partenza e di arrivo
public void prendiBinario(Stazione a, Treno t){
int bp = indiceBinario(getNome()+a.getNome());
int ba = a.indiceBinario(a.getNome()+getNome());
try{
synchronized(binari.get(bp)){
while(binari.get(bp).isOccupato()){
t.wait();
}
synchronized(a.binari.get(ba)){
while(binari.get(bp).isOccupato() && a.binari.get(ba).isOccupato()){
t.wait();
}
binari.get(bp).setOccupato();
a.binari.get(ba).setOccupato();
}
}
}
catch(Exception e){
}
finally{
}
}
//libera il binario giusto dalla stazione di partenza e di arrivo
public void liberaBinario(Stazione a){
int bp = indiceBinario(getNome()+a.getNome());
int ba = a.indiceBinario(a.getNome()+getNome());
try{
synchronized(binari.get(bp)){
synchronized(a.binari.get(ba)){
binari.get(bp).setLibero();
a.binari.get(ba).setLibero();
a.binari.get(ba).notify();
}
binari.get(bp).notify();
}
}
catch(Exception e){
}
finally{
}
}
//METODI DELLA CLASSE BINARIO CHE E' LA RISORSA CONDIVISA
//LA CLASSE HA UN CAMPO DATI private boolean Occupato = false;
public synchronized void setOccupato(){
Occupato = true;
}
public synchronized void setLibero(){
Occupato = false;
}
public synchronized boolean isOccupato(){
return Occupato;
}
se pensate manchi qualcosa ditemi, ma dovrebbe esserci tutto il codice necessario per rispondermi...
grazie mille da subito
Max
P.S. Non voglio mettere fretta a nessuno...ma devo consegnare entro domenica sera e devo ancora fare un minimo di interfaccia grafica...quindi vi prego rispondete in fretta