View Full Version : [JAVA] Notify, NotifyAll ,etc... sincronizzazione
ciao a tutti!
ho un problema tentando di realizzare un programma di ping pong fra 4 giocatori: uno che dice ping, un altro pong, pang, pung,..,
il problema e' che vorrei che solo si risvegliasse il thread che deve giocare in quel momento e non tutti quanti invocando un notifyAll.. come si puo' fare in java???
per farmi capire i 4 thread dovrebbero fare qualcosa di questo tipo:
ping,pong,pang,pung,ping,pong,pang,pung, etc.,.,.,
https://kdp.amazon.com/community/profile.jspa?userID=589627
pero' non vorrei risvegliarli tutti ad ognicambio di turno, ma solo quello che deve giocare.,.,
ciao a tutti!
ho un problema tentando di realizzare un programma di ping pong fra 4 giocatori: uno che dice ping, un altro pong, pang, pung,..,
il problema e' che vorrei che solo si risvegliasse il thread che deve giocare in quel momento e non tutti quanti invocando un notifyAll.. come si puo' fare in java???Innanzitutto bisogna vedere come è la architettura della tua applicazione. Hai 4 giocatori ma gestiti come?? È una applicazione client-server? E i giocatori cosa/come controllano? E cosa fa la tua applicazione?
Non è nemmeno detto che usare il sistema di wait/notify sia la soluzione migliore! Anzi .. personalmente non lo credo affatto.
morskott
31-03-2008, 14:04
ad un primo acchitto prova cosìclass Runner implements Runnable{
Semaphore sem;
PingPong(Semaphore s){
sem=s;
}
public void run(){
sem.acquire();
Random rand=new Random();
String toWrite=rand.nextInt(100)>50? "ping":"pong";
System.out.println(toWrite);
sem.release();
}
}
public class PingPong{
public static void main(String[] args){
Semaphore sem=new Semaphore(1);
for (int i=0;i<100;i++){
(new Thread(new Runner(sem))).start();
}
for(;;);
}
}
Innanzitutto bisogna vedere come è la architettura della tua applicazione. Hai 4 giocatori ma gestiti come?? È una applicazione client-server? E i giocatori cosa/come controllano? E cosa fa la tua applicazione?
Non è nemmeno detto che usare il sistema di wait/notify sia la soluzione migliore! Anzi .. personalmente non lo credo affatto.
sono dei thread,.,. ogni thread e' un giocatore.,., e poi c'e' un thread arbitro che da' il via,.., semplicemente,.,. ho provato a farlo con l'uso di wiat e notify, funciona, pero' si risvegliano tutti i thread in attesa del lock sull'oggetto.,., ed e' uno spreco di risorse.,,. lo vorrei fare in modo che si risvegliasse solo il giocatore seguente.,., che altri metodi ci sono in java oltre notify e wait??
mad_hhatter
31-03-2008, 15:06
una soluzione sporca sporca potrebbe essere quella di associare a ciascun thread un semaforo su cui solo il thread T associato si sospende e su cui fa notify solo il thread che precede T
una soluzione sporca sporca potrebbe essere quella di associare a ciascun thread un semaforo su cui solo il thread T associato si sospende e su cui fa notify solo il thread che precede T
uhm.,., mi potresti fare un esempio con codice???
ad un primo acchitto prova cosìclass Runner implements Runnable{
Semaphore sem;
PingPong(Semaphore s){
sem=s;
}
public void run(){
sem.acquire();
Random rand=new Random();
String toWrite=rand.nextInt(100)>50? "ping":"pong";
System.out.println(toWrite);
sem.release();
}
}
public class PingPong{
public static void main(String[] args){
Semaphore sem=new Semaphore(1);
for (int i=0;i<100;i++){
(new Thread(new Runner(sem))).start();
}
for(;;);
}
}
cosi' non crei 100 thread que eseguono solo 1 volta ping oppure pong e poi terminano??
quello che vorrei fare io e' avere 5 thread in totale (1 arbitro e 4 giocatori),.,. l'arbitro da il via ed i 4 giocatori si alternano dicendo ping,pong,pang e pung,.,. e come ho gia' detto senza che si risveglino tutti ad opgni cambio di turno
ho trovato la soluzione grazie a IBM:
http://www.ibm.com/developerworks/java/library/j-spnotif/
morskott
31-03-2008, 23:47
cosi' non crei 100 thread que eseguono solo 1 volta ping oppure pong e poi terminano??
quello che vorrei fare io e' avere 5 thread in totale (1 arbitro e 4 giocatori),.,. l'arbitro da il via ed i 4 giocatori si alternano dicendo ping,pong,pang e pung,.,. e come ho gia' detto senza che si risveglino tutti ad opgni cambio di turno
La mia era solo uno sketch di idea, crei un semaforo con un solo "ticket" che passi ai vari thread, il primo fa un acquire e si prende il ticket bloccando gli altri e quando ha finito fa una release sul semaforo che sbloccherà gli altri thread di cui uno soltanto farà una release e quindi si sveglierà al cambio di turno.
Poi a immergere questa metodologia nell'implementazione reale del tuo caso non ci vuole molto: avrai una sezione /*TURNO*/ che dovrà essere immediatamente preceduta da una sem.acquire e immediatamente succeduta da una sem.release e dentro la quale i 4 giocatori si alternano dicendo ping,pong,pang e pung.
Se mi fai un (anche abbozzato) caso d'uso dell'applicazione (o un sequence) tirò giu qualche riga
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.