Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
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


HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Bentornati nel 2007: le memorie DDR3 rin...
Stellantis aderisce ad AI4I e Fondazione...
Google Pixel 10a: prime conferme sul pre...
ISRO potrebbe lanciare la capsula Gagany...
Un nuovo leak conferma dimensioni e novi...
Steam Machine: requisiti Verified piu' s...
NVIDIA GeForce RTX 5070 Ti fuori produzi...
Sony ha annunciato i nuovi giochi che en...
IBM Sovereign Core: la sovranità ...
Cerchi un'asciugatrice conveniente su Am...
Ayaneo Pocket Play arriverà in ri...
iPad Pro 11'' con chip M4 scende a 949€ ...
The Sims entra in una nuova era, ma l'ac...
Netflix, Disney o Prime Video: qual &egr...
Perplexity blocca la generazione di imma...
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: 22:51.


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