Torna indietro   Hardware Upgrade Forum > Software > Programmazione

WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-07-2006, 17:10   #1
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
[JAVA]Come blocco un thread?

Ho un thread in stato di runnable, devo fare in modo però che dopo aver eseguito il codice del metodo run() si fermi fino a quando non glielo dico io, cioè vorrei avere la possibilità di sospendere il thread e risvegliarlo quando mi pare.
Quello che potrebbe fare al caso mio è yeld() ma non va bene perchè non ho altri thread a cui passare il comando...non esiste un modo per bloccare un thread?

Ovviamente questo non va bene:
Codice:
Thread t =new Thread(){
       public void run(){
              while(true){
                     if(ok){
                           ...esegui codice...
                     }
               }
       }
};
Per il semplice motivo che mi spreca troppe risorse e poi è anche brutto come metodo... Ma quello che voglio ottenere è proprio quello.
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 17:15   #2
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Ho fatto del casino forse, allora vorrei fare una cosa del genere:
Codice:
Thread t =new Thread(){
       public void run(){
               ...esegui codice...
               sospendi();  //sospende il thread finchè non viene risvegliato
       }
};

public void risveglia(){
      ...codice...  //fa rieseguire il metodo run()
}
E' fattibile?
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 17:17   #3
The3DProgrammer
Senior Member
 
Iscritto dal: May 2000
Messaggi: 1459
Quote:
Originariamente inviato da MEMon
Ho un thread in stato di runnable, devo fare in modo però che dopo aver eseguito il codice del metodo run() si fermi fino a quando non glielo dico io, cioè vorrei avere la possibilità di sospendere il thread e risvegliarlo quando mi pare.
Quello che potrebbe fare al caso mio è yeld() ma non va bene perchè non ho altri thread a cui passare il comando...non esiste un modo per bloccare un thread?

Ovviamente questo non va bene:
Codice:
Thread t =new Thread(){
       public void run(){
              while(true){
                     if(ok){
                           ...esegui codice...
                     }
               }
       }
};
Per il semplice motivo che mi spreca troppe risorse e poi è anche brutto come metodo... Ma quello che voglio ottenere è proprio quello.


Codice:
Thread t =new Thread(){
       private Object monitor=new Object();
       private bool suspended=false;


      public void suspend(){ suspended = true;}
      public void notify(){ suspended = false; monitor.notify();}

    

       public void run(){
              while(true){
                     if(suspended){
                             try{
                               monitor.wait();
                             }catch(InterruptedException ecxeption){
                             ...
                             }
                      }
                      ...esegui codice...
                     
               }
       }
};
ciao

Ultima modifica di The3DProgrammer : 28-07-2006 alle 17:23.
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 17:29   #4
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Ti ringrazio, non sapevo della possibilità di usare un oggetto in questo modo!
Grazie!
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 18:03   #5
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Mi solleva l'eccezzione "current thread not owner", per quale motivo?
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 18:09   #6
The3DProgrammer
Senior Member
 
Iscritto dal: May 2000
Messaggi: 1459
Quote:
Originariamente inviato da MEMon
Mi solleva l'eccezzione "current thread not owner", per quale motivo?

spe su quale riga?


sono un po intontito (appena svegliato) quindi sicuramente ho scordato qualkosa
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 18:10   #7
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
su monitor.wait()
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 18:15   #8
The3DProgrammer
Senior Member
 
Iscritto dal: May 2000
Messaggi: 1459
ma ke kakkio ho scritto

aspe che ti posto la versione corretta....
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 18:17   #9
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
no problem!
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 18:20   #10
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Ho trovato questa che fa uso di syncronized:
Codice:
    // Create and start the thread
    MyThread thread = new MyThread();
    thread.start();
    
    while (true) {
        // Do work
    
        // Pause the thread
        synchronized (thread) {
            thread.pleaseWait = true;
        }
    
        // Do work
    
        // Resume the thread
        synchronized (thread) {
            thread.pleaseWait = false;
            thread.notify();
        }
    
        // Do work
    }
    
    class MyThread extends Thread {
        boolean pleaseWait = false;
    
        // This method is called when the thread runs
        public void run() {
            while (true) {
                // Do work
    
                // Check if should wait
                synchronized (this) {
                    while (pleaseWait) {
                        try {
                            wait();
                        } catch (Exception e) {
                        }
                    }
                }
    
                // Do work
            }
        }
    }
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 18:25   #11
The3DProgrammer
Senior Member
 
Iscritto dal: May 2000
Messaggi: 1459
infatti
devi semplicemente mettere le chiamate a wait() e notify() tra 2 blokki synchronized(monitor) altrimenti come diventa il thread owner del monitor? Quella postata da te è praticamente come la mia, solo che usa come oggetto monitor il thread stesso. Personalmente nn mi piace come scelta, anche se perfettamente leggittima (se espliciti l'oggetto monitor diventa + chiaro IMHO)


ciao e scusa, la sonnolenza fa brutti skerzi

Ultima modifica di The3DProgrammer : 28-07-2006 alle 18:30.
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 18:28   #12
The3DProgrammer
Senior Member
 
Iscritto dal: May 2000
Messaggi: 1459
Codice:
Thread t =new Thread(){
       private Object monitor=new Object();
       private bool suspended=false;


      public void suspend(){ suspended = true;}
      public void notify(){ 

           suspended = false; 
            synchronized(monitor){
                monitor.notify();
             }
       }

    

       public void run(){
              while(true){
                     if(suspended){
                             try{
                               synchronized(monitor){
                                    monitor.wait();
                                }
                             }catch(InterruptedException ecxeption){
                             ...
                             }
                      }
                      ...esegui codice...
                     
               }
       }
};
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 18:29   #13
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Ok grazie mille!
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2006, 00:51   #14
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quel suspended deve essere volatile o il suo valore deve essere mutato all'interno di un blocco sincronizzato altrimenti non c'è garanzia che il valore di suspended letto dal Thread in attesa al momento del risveglio sia l'ultimo valore immesso da un Thread concorrente.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2006, 11:58   #15
cisc
Senior Member
 
L'Avatar di cisc
 
Iscritto dal: Nov 2002
Città: Cosenza --> Roma
Messaggi: 853
Codice:
Thread t =new Thread(){
       private Lock monitor=new ReentrantLock();

       private boolean suspended=false;

       private Condition wait = monitor.newCondition();


      public void suspend(){ 
          monitor.lock();
          try {       
              suspended = true;
          } finally {
              monitor.unlock();
          }    
      }
      public void notify(){ 
          monitor.lock();
          try { 
                suspended = false; 
                wait.signal();
          } finally {
              monitor.unlock();
          }   
       }

    

       public void run(){
              while(true){
                          monitor.lock();
                          try { 
                                while (suspendend)
                                    wait.await();
                         }catch(InterruptedException ecxeption){
                         ...
                         } finally {
                              monitor.unlock();
                         }   
                  ...esegui codice...
                     
               }
       }
};
P.S: Java 1.5 only
__________________
GNU MyServer Wants YOU!!
We live thinking we will never die. We die thinking we had never lived. Jason Becker

Ultima modifica di cisc : 29-07-2006 alle 12:07.
cisc è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2006, 13:19   #16
The3DProgrammer
Senior Member
 
Iscritto dal: May 2000
Messaggi: 1459
Quote:
Originariamente inviato da PGI-Bis
Quel suspended deve essere volatile o il suo valore deve essere mutato all'interno di un blocco sincronizzato altrimenti non c'è garanzia che il valore di suspended letto dal Thread in attesa al momento del risveglio sia l'ultimo valore immesso da un Thread concorrente.

hai perfettamente ragione. suspended è una variabile a cui si accede in concorrenza, per cui deve essere inserita in un blocco synchronized. In questo caso basta rendere synchronized i metodi suspend e notify (che tra l'altro come nomi di metodi nn vanno bene xkè significherebbe overriding di metodi final, ero proprio intronato ieri ) ed inserire l'accesso in run alla variabile suspended in un blocco synchronized(this).

ciauz
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2006, 14:29   #17
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Quote:
Originariamente inviato da The3DProgrammer
...ed inserire l'accesso in run alla variabile suspended in un blocco synchronized(this).

ciauz
Ovvero?
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2006, 14:34   #18
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Ho fatto così:
Codice:
synchronized(controllo){
	synchronized(this){
		if(sospeso){
			try{
				controllo.wait();
			}
				catch(InterruptedException e){System.out.println(e);}
			}
		}
	}
Ma ora non funziona più, il thread non si risveglia, come devo fare?
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2006, 15:39   #19
The3DProgrammer
Senior Member
 
Iscritto dal: May 2000
Messaggi: 1459
Quote:
Originariamente inviato da MEMon
Ho fatto così:
Codice:
synchronized(controllo){
	synchronized(this){
		if(sospeso){
			try{
				controllo.wait();
			}
				catch(InterruptedException e){System.out.println(e);}
			}
		}
	}
Ma ora non funziona più, il thread non si risveglia, come devo fare?

così nn si sveglia + xkè il thread, entrando in wait, rilascia la ownership sul monitor controllo ma nn sull'altro (this) cosa che provoca l'impossibilità di accedere a controllo.notify() da parte degli altri thread concorrenti. Dovresti fare una cosa del genere:

[code]

Codice:
while(true){
    boolean mustWait=false;

    synchronized(this){
        mustWait=sospeso;
    }

     if(mustWait){
        synchronized(controllo){      
              try{
                   controllo.wait();
	}
	catch(InterruptedException e){System.out.println(e);}
        }
    }
}
a questo punto xò questa implementazione comincia a nn 'piacermi + (1 solo monitor è + ke sufficiente a realizzare una cosa del genere, complicare il codice con troppe strutture di sincronizzazione in ambito multithread è sempre male) per cui potresti usare l'implementazione che hai trovato sul web (che usa l'oggetto thread stesso come monitor), o quella ke ha postato cisc

ciauz

Ultima modifica di The3DProgrammer : 29-07-2006 alle 15:56.
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2006, 15:47   #20
The3DProgrammer
Senior Member
 
Iscritto dal: May 2000
Messaggi: 1459
ora che guardo bene anche quella ke hai postato xò elimina quegli abberranti

Codice:
synchronized(thread){
thread.pleaseWait=x;
}

e metti 2 metodi synchronized, ma soprattutto metti pleaseWait privata

ciau

Ultima modifica di The3DProgrammer : 29-07-2006 alle 15:49.
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
Una tassa di 5,5 centesimi su ogni gigab...
Vuoi clonare un videogioco con l'IA? Cla...
Furto da 6,3 miliardi di dollari, Binanc...
Gli USA dipendono dai robot stranieri: T...
Volkswagen non ha più soldi per l...
Telescopio spaziale Hubble: la NASA cerc...
Più sottile e potente: le nuove i...
Il JPL estende la vita operativa della s...
DAZN Full è in offerta: tutta la ...
GTA 6 su PC potrebbe arrivare prima del ...
Da zero al tracciato in secondi: LibreCo...
Il regista Rian Johnson lancia a 12,99 d...
Microsoft stravolge l'app Sicurezza di W...
Mercato smartphone in caduta libera: -20...
Android 17 QPR3 Beta 3 riporta il blocco...
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: 05:17.


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