|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 654
|
[Java - Java Thread] help attendere gli utenti
ciao ragazzi...
vi spiego la situazione: nel mio main vengono creati 5 giocatori (tramite un for che rifà a Giocatori.java).... e vengono creati giusti e tutto ok. dopo ogni start(), c'è anche un metodo chiamato giocatoriPronti, che si incrementa. Quindi 5 giocatori, giocatoriPronti=5. Codice:
Giocatore[] giocatore = new Giocatore[5];
for (int i=0; i<5; i++){
giocatore[i]=new Giocatore(i,tavolo);
System.out.println("Giocatore "+i+" creato");
giocatore[i].start();
tavolo.giocatoriPronti();
System.out.println("Giocatore "+i+" lanciato");
Ora, ho un .java chiamato Arbitro, che prima di fare qualunque cosa, controlla che vi siano gli utenti... Codice:
public void attendiGiocatori(){
synchronized(syncGiocatoriPronti){
while(tavolo.getGiocatoriPronti()<5){
System.out.println("NO "+tavolo.giocatoriPronti);
try{
syncGiocatoriPronti.wait();
}
catch (InterruptedException e){
e.printStackTrace();
}
}
System.out.println("SI "+tavolo.giocatoriPronti);
}
}
ma.............. il tutto non funziona. quando lancio dal prompt, rimane tutto in attesa, come se Arbitro non rilevasse che ci sono 5 giocatori, e quindi rimane in wait.............. mi sapete aiutare???
__________________
Macbook Pro 15'' Mid 2015 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Bergamo
Messaggi: 401
|
Serve più codice per capire dove si incasinano i thread.
Chi chiama il metodo attendiGiocatori()? Saluti
__________________
iMac 27" 5K |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 654
|
lo chiama Arbitro.java
__________________
Macbook Pro 15'' Mid 2015 |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Bergamo
Messaggi: 401
|
Lo chiama solo lui?
Se si non dovrebbe servire quel synchronized ![]() Se puoi posta l'intero codice così riusciamo ad aiutarti Saluti
__________________
iMac 27" 5K |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 654
|
io lo posto anche. è tanto, ma va beh eheheh
tolgo un pò di roba che non serve di sicuro. Main Codice:
public class Main{
public static void main(String[] args){
Tavolo tavolo = new Tavolo();
Arbitro arbitro = new Arbitro(tavolo);
System.out.println("Arbitro creato");
arbitro.start();
System.out.println("Arbitro lanciato");
Giocatore[] giocatore = new Giocatore[5];
for (int i=0; i<5; i++){
giocatore[i]=new Giocatore(i,tavolo);
System.out.println("Giocatore "+i+" creato");
giocatore[i].start();
tavolo.giocatoriPronti();
System.out.println("Giocatore "+i+" lanciato");
}
try{
arbitro.join();
}
catch(Exception e){
System.out.println("ERRORE JOIN MAIN: "+e);
}
}
}
Codice:
public class Arbitro extends Thread{
private Tavolo tavolo;
private Object syncGiocatoriPronti;
private long orologio=System.currentTimeMillis();
public Arbitro(Tavolo t) {
super("Arbitro");
tavolo = t;
syncGiocatoriPronti=new Object();
}
public void run(){
attendiGiocatori();
System.out.println("Benvenuti a tutti!!!");
-----------qua ho tolto codice che non centra-----------
}
public void attendiGiocatori(){
synchronized(syncGiocatoriPronti){
while(tavolo.getGiocatoriPronti()<5){
System.out.println("NO "+tavolo.giocatoriPronti);
try{
syncGiocatoriPronti.wait();
}
catch (InterruptedException e){
e.printStackTrace();
}
}
System.out.println("SI "+tavolo.giocatoriPronti);
}
}
}
Codice:
int giocatoriPronti=0;
-----------qua ho tolto codice che non centra-----------
synchronized public void giocatoriPronti(){
giocatoriPronti++;
}
synchronized public int getGiocatoriPronti(){
return giocatoriPronti;
}
__________________
Macbook Pro 15'' Mid 2015 |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Nov 2007
Messaggi: 122
|
Non sono sicuro di quello che dico perchè non ho testato, ma nel metodo giocatoriPronti() ci vorrebbe una bel notifyAll() per risvegliare tutti i girocatori
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 654
|
Quote:
se non trovo via di scampo da questo problema, mi conviene studiare un modo per far partire i giocatori (e va beh qua nel main c'è lo start()), addormentarli, e farli svegliare dall'Arbitro quando mi serve. Anzi se qualcuno ha un idea...
__________________
Macbook Pro 15'' Mid 2015 |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Bergamo
Messaggi: 401
|
Da quel che vedo, ti suggerirei caldamente di studiarti molto meglio la parte sui thread, sul loro utilizzo e sul loro controllo. In quel codice ci sono un sacco di errori che non stò nemmeno ad elencare
Cmq per darti un idea di sincronizzazione di thread simile a quella che vorresti ottenere tu, guardati questo codice: Codice:
public class ThreadSyncDemo {
public static void main(String[] args) {
new ThreadSyncDemo();
}
public ThreadSyncDemo() {
Tavolo tavolo = new Tavolo();
new Arbitro(tavolo).start();
new Giocatore(0, tavolo).start();
new Giocatore(1, tavolo).start();
new Giocatore(2, tavolo).start();
new Giocatore(3, tavolo).start();
new Giocatore(4, tavolo).start();
}
private class Giocatore extends Thread {
private Tavolo tavolo;
private int i;
public Giocatore(int i, Tavolo tavolo) {
this.i = i;
this.tavolo = tavolo;
}
@Override
public void run() {
System.out.println("Giocatore " + i + " inizia.");
tavolo.aggiungiGiocatore();
System.out.println("Giocatore " + i + " termina.");
}
}
private class Arbitro extends Thread {
private Tavolo tavolo;
public Arbitro(Tavolo tavolo) {
this.tavolo = tavolo;
}
@Override
public void run() {
System.out.println("Arbitro inizia.");
while(tavolo.getGiocatoriCollegati() < 5) {
System.out.println("Limite giocatori non ancora raggiunto.");
}
System.out.println("Arbitro termina.");
}
}
private class Tavolo {
private int giocatoriCollegati;
private final Object inUse;
public Tavolo() {
giocatoriCollegati = 0;
inUse = new Object();
}
public void aggiungiGiocatore() {
synchronized(inUse){
giocatoriCollegati++;
}
}
public int getGiocatoriCollegati() {
synchronized(inUse){
return giocatoriCollegati;
}
}
}
}
__________________
iMac 27" 5K |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 654
|
grazie mille! quindi così posso gestire il problema da dio! e ho anche capito il codice! il mio problema è che leggere codice riesco, ma poi partire da 0 per fare cose diverse, mi incasino. grazie di cuore, nel caso posterò ancora
__________________
Macbook Pro 15'' Mid 2015 |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 654
|
visto che sei disponibile ti chiedo una cosa.
se io voglio che arbitro fermi i giocatori, stampi a schermo 2 robe, faccia ripartire i giocatori (e qua intendo che il giocatore rifà il run()), dopo che fanno il run li riferma, e così via..... come faccio a farlo? (seguendo il filone delle cose che mi hai appena scritto) sempre grazie e se puoi/vuoi
__________________
Macbook Pro 15'' Mid 2015 |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 654
|
ehm.... il tuo codice di prima non va.
mi esce giocatori creati e ok ma poi esce una valanga di volte limite non raggiunto, poi ancora giocatori collegati, poi ancora limite, e poi arbitro termina. parlo del tuo codice, il mio è commentato
__________________
Macbook Pro 15'' Mid 2015 |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 654
|
ah ecco perchè non mi và. tu hai fatto tutto in un unico file .java (almeno che non hai scritto sbagliato il codice prima)
io invece o un file per ogni cosa.... giocatore.java arbitro.java tavolo.java main.java
__________________
Macbook Pro 15'' Mid 2015 |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Bergamo
Messaggi: 401
|
Si si era tutto in un unico file
Per quanto riguarda il fermare tutto e poi far ripartire dovresti usare wait() e notify() o notifyAll(). Ora vado a nanna che domani ho la leva alle 6 cmq domani appena torno ti posto dell'altro codice Notte a tutti
__________________
iMac 27" 5K |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 654
|
ok thanks!
cmq il tuo codice (proprio solo il tuo in un unico file) funziona, ma come mai prima dice 7 volte limite non raggionto, poi appaiono i giocatori, e poi dice ok.... non si può "reincastrare" le frasi per renderlo più ordinato?
__________________
Macbook Pro 15'' Mid 2015 Ultima modifica di IAmZak : 11-01-2009 alle 23:48. |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 654
|
ok ho messo anche io tutto in un unico file. e ho corretto usando il tuo codice, e funziona tutto
Ora mi serve solo sapere queste 2 cose, e dopo posso dire grazie di cuore e non romperò più le balle, promesso 1) Quote:
se ho nel run di giocatore, un while{Arbitro.a==7){...}, e a lo modifica Arbitro (durante il suo run)........... come faccio a far capire al giocatore che questa a è 7 (e quindi lui esce dal while e prosegue le sue storie) fine, giuro poi non sasso più :-) siete un forum magnifico :-)
__________________
Macbook Pro 15'' Mid 2015 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:38.





















