Michele Genchi ha scritto:
Si caro, hai ragione object, e sono ereditate da tutte le sottoclassi, cmq in questo caso; correggimi se sbaglio, è applicato alla classe thread...
No, non c'entra direttamente con un java.lang.Thread, cioè non c'è nulla di speciale nel suo riguardo. wait/notify/notifyAll sono di qualunque oggetto. Anche un oggetto java.lang.Thread alla fin fine .. è un oggetto, quindi anche su di esso si può acquisire il lock e poi usare i 3 metodi citati. (io però non andrei mai ad usare un java.lang.Thread come lock/condition-queue)
Michele Genchi ha scritto:
public class CallMe {
boolean pausa;
synchronized public void call(String msg,boolean p) {
pausa=p;
System.out.print("[" + msg);
if (!pausa)
try {
Thread.sleep(2000);
System.out.println("]");
pausa=true;
wait(); }
catch (Exception e){}
else { notifyAll(); }
}
}
No, non basta (e non è nemmeno proprio corretto) per imporre una sequenzialità ai thread in modo da stampare i messaggi in un ben preciso ordine.
Ci sono (sicuramente) diversi modi di realizzare questa cosa. Ne dico giusto uno:
Si può dare agli oggetti Caller un numero progressivo, es. il primo Caller 0, il secondo 1, ecc...
Poi in CallMe si mette una variabile di istanza che tiene il numero relativo al Caller che deve essere lasciato "passare" per stampare il messaggio.
Poi quando in Caller invochi il call di CallMe, oltre a passare il messaggio passi anche il numero del Caller.
Se in CallMe il numero da lasciar passare è 0, vuol dire che il Caller 0 deve poter stampare il messaggio mentre gli altri Caller (anche se dovessero arrivare prima in quel punto) devono bloccarsi e stare in attesa.
Una volta stampato il messaggio, incrementi il numero (in modo che il Caller successivo possa passare) e fai notifyAll().
Ricordati che il wait() andrebbe sempre fatto dentro un ciclo (tipicamente un while) che deve testare una condizione che è quella che deve "reggere" affinché il thread stia in attesa.
Prova con queste indicazioni.