Newsgroup: it.comp.java
Titolo: Threads e synchronized

Ciao a tutti!!
Sto impazzendo con i threads... dunque.. a quanto avevo capito definendo un
metodo synchronized faccio in modo che un solo thread alla volta possa
trovarsi al suo interno giusto?? Questo è il mio metodo synchronized
all'interno della classe CentraleTaxi:
synchronized void prenotaTaxi(Cliente nuovoCliente)
 {
  ElemListaTaxi p;
  Taxi taxiPrenotato;
  boolean trovato;
  p=testa;
  taxiPrenotato=null;
  try
  {
    System.out.println("GRUPPO("+ nuovoCliente.getId() +"): SONO
ENTRATO--------------------------------------------");
    for (int i=0;i<nuovoCliente.nComponenti;i++)
    {
     while(nTaxiLiberi==0)
      wait();
     taxiPrenotato=taxiPiuVicino(nuovoCliente);
     nTaxiLiberi--;
     System.out.println("Il taxi prenotato ha l'id: " + taxiPrenotato.id);
     taxiPrenotato.clienteAssegnato = nuovoCliente;
     taxiPrenotato.cambiaStato(2);
    }
   System.out.println("GRUPPO("+ nuovoCliente.getId() +"): SONO
USCITO***************************************************");
   notify();
  }catch (InterruptedException e) {}
 }
Ho messo in evidenza quando un thread entra ed esce per vedere subito se
funzionava... com'è possibile che mi dia risultati come questo in cui 4 o +
gruppi(threads) entrano contemporaneamente senza che nessuno esca dal
metodo???
GRUPPO(5): SONO ENTRATO--------------------------------------------
TAXI(4): MI HANNO ASSEGNATO IL CLIENTE(0)
TAXI(17): la distanza da percorrere e': 57
TAXI(5): la distanza da percorrere e': 65
TAXI(11): la distanza da percorrere e': 93
TAXI(4): la distanza da percorrere e': 69
GRUPPO(4): SONO ENTRATO--------------------------------------------
TAXI(2): la distanza da percorrere e': 58
GRUPPO(3): Chiamo la centrale per prenotare un taxi
GRUPPO(3): SONO ENTRATO--------------------------------------------
GRUPPO(2): Chiamo la centrale per prenotare un taxi
GRUPPO(2): SONO ENTRATO--------------------------------------------
Il main è questo:
public class Esame
{
 public static void main(String[] args)
 {
  CentraleTaxi C = new CentraleTaxi(20);
  System.out.println("INIZIO");
  for (int i=0;i<6;i++)
   Gruppo G1 = new Gruppo(C,S);
 }
}
Potrebbe essere il metodo taxiPiuVicino che da problemi?? E' solo un metodo
che calcola il taxi + vicino al gruppo.... può essere che mentre il thread
si trova dentro a taxiPiuVicino qualche altro thread entra in prenotaTaxi?
Ditemi voi... non ci capisco + niente... :(

 che calcola il taxi + vicino al gruppo.... puň essere che mentre il thread


Ciao, Fabio. Scusa il post precedente: mi e' partito un colpo...
Sembra che i tuoi thread entrino in prenotaTaxi() e rimangano in wait. 
Quando un thread va in wait su un oggetto, rilascia temporaneamente il 
lock, per cui e' normale che piu' thread riescano ad entrare in 
prenotaTaxi(). Perche' poi rimangano in wait, dal codice che riproduci 
non si vede. Da qualche parte dovrebbe esserci un metodo in cui i taxi 
si liberano o vengono aggiunti, nTaxiLiberi viene incrementato e viene 
invocato notifyAll() per dare la possibilita' ai thread in wait di 
prenotare (il notify() dove l'hai messo tu, alla fine di prenotaTaxi(), 
lo vedo piuttosto male).
Ciao,
Alberto
---
do...@mclink.it
---
JavaClass - Formazione Java e XML
java...@javaclass.it
http://www.javaclass.it

 ha scritto nel messaggio
news:3ECA12B1...@mclink.it...


 Ditemi voi... non ci capisco + niente... :(
Ristudia con attenzione la sincronizzazione in Java.
- Dario