Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
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


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Roscosmos ha posticipato (ancora) il lan...
Isar Aerospace si prepara al secondo lan...
Tory Bruno è entrato in Blue Orig...
Fujifilm lancia la cartuccia per archivi...
Dreame H15 Mix: la soluzione 7-in-1 per ...
AirPods Pro 3 in forte sconto su Amazon:...
36 offerte Amazon, molte appena partite:...
2 caricatori multipli eccezionali: da 28...
OLED e 360 Hz a un prezzo senza preceden...
Roborock Q10 S5+ a un prezzo molto conve...
Upgrade PC a prezzo ridotto: le migliori...
Sono i 6 smartphone migliori su Amazon: ...
Google Pixel 9a a 361€, mai così ...
Super sconti sugli spazzolini Oral-B, an...
Aspira a 6000Pa, lava bene, costa 139€: ...
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: 07:40.


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