|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Spagna
Messaggi: 557
|
[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/pro...?userID=589627 pero' non vorrei risvegliarli tutti ad ognicambio di turno, ma solo quello che deve giocare.,., Ultima modifica di Mazza2 : 08-02-2015 alle 18:01. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Non è nemmeno detto che usare il sistema di wait/notify sia la soluzione migliore! Anzi .. personalmente non lo credo affatto.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
ad un primo acchitto prova così
Codice:
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(;;);
}
}
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Spagna
Messaggi: 557
|
Quote:
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?? |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
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
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Spagna
Messaggi: 557
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Spagna
Messaggi: 557
|
Quote:
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 |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Spagna
Messaggi: 557
|
|
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
Quote:
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
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:51.




















