Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-01-2009, 15:51   #1
IAmZak
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");
tavolo è un .java pieno di metodi.

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);
        }
        }
getGiocatoriPronti è semplicemente un metodo che dà un return della variabile giocatoriPronti (che come spiegato prima diventa 5, incrementandosi).


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
IAmZak è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2009, 16:26   #2
Don[ITA]
Senior Member
 
L'Avatar di Don[ITA]
 
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
Don[ITA] è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2009, 16:32   #3
IAmZak
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 654
Quote:
Originariamente inviato da Don[ITA] Guarda i messaggi
Chi chiama il metodo attendiGiocatori()?

Saluti
lo chiama Arbitro.java
__________________
Macbook Pro 15'' Mid 2015
IAmZak è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2009, 17:39   #4
Don[ITA]
Senior Member
 
L'Avatar di Don[ITA]
 
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
Don[ITA] è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2009, 20:11   #5
IAmZak
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);
		}
    }
}
Arbitro
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);
        }
	}
}
questi sono i metodi chiamati
Codice:
int giocatoriPronti=0;
-----------qua ho tolto codice che non centra-----------
synchronized public void giocatoriPronti(){
        giocatoriPronti++;
}
	
synchronized public int getGiocatoriPronti(){
	return giocatoriPronti;
}
grazie a tutti, siete gentilissimi!!!!
__________________
Macbook Pro 15'' Mid 2015
IAmZak è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2009, 20:52   #6
Ken1986
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
Ken1986 è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2009, 20:55   #7
IAmZak
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 654
Quote:
Originariamente inviato da Ken1986 Guarda i messaggi
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
ma notifyAll li non serve. cioè quel metodo è solo un ++ per la variabile, che poi quando viene letta dall'arbitro (e se è 5), fà si che il programma prosegua.

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
IAmZak è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2009, 22:54   #8
Don[ITA]
Senior Member
 
L'Avatar di Don[ITA]
 
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;
            }
        }


    }
}
Se non ti è chiaro chiedi pure
__________________
iMac 27" 5K
Don[ITA] è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2009, 23:07   #9
IAmZak
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
IAmZak è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2009, 23:13   #10
IAmZak
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
IAmZak è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2009, 23:28   #11
IAmZak
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
IAmZak è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2009, 23:38   #12
IAmZak
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
IAmZak è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2009, 23:42   #13
Don[ITA]
Senior Member
 
L'Avatar di Don[ITA]
 
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
Don[ITA] è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2009, 23:44   #14
IAmZak
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.
IAmZak è offline   Rispondi citando il messaggio o parte di esso
Old 12-01-2009, 00:37   #15
IAmZak
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:
Originariamente inviato da IAmZak Guarda i messaggi
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?
2)
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
IAmZak è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
GTA 6 gratis se nasce un figlio il giorn...
Quasi la metà degli smartphone at...
DDR5 a 16 dollari al gigabyte: Framework...
Meno di 3kg per 'diventare' bionici: l'u...
Al regalo di San Valentino ci pensa HUAW...
Intel multata in India: 30 milioni di do...
Beast of Reincarnation ha una data di us...
Provati Reno15 e Reno15 FS: analisi comp...
L'Europa sfida la Cina sul litio: in Fin...
Sono 32, di cui 6 nuove, le offerte Amaz...
Rinnovo dei coupon Amazon nascosti: ecco...
Corsair aggiorna la confezione delle RAM...
Ecco tutti i robot aspirapolvere in offe...
Tachyum: dal processore universale alle ...
L'eVTOL tedesco per missioni mediche e m...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:03.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v