Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
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
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


Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
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...
'Il mondo non ha mai visto nulla di simi...
La Commissione europea mette sotto indag...
Arriva il primo computer quantistico ad ...
'Se lavori al PC sei a rischio': la prev...
Windows 11 introduce il supporto nativo ...
Apple AirDrop su Android: dopo Pixel 10,...
Upgrade PC senza spendere una fortuna: G...
Sistema di sblocco alla iPhone anche su ...
29 offerte Amazon, rinnovate: in 2 minut...
Offerte imperdibili su lavatrici e asciu...
Kingdom Come: Deliverance 2 arriva su Ga...
Il Texas fa causa a TP-Link: accuse di m...
Google annuncia le date ufficiali di I/O...
Nuovo rilancio di Amazon Haul: -20% se s...
NVIDIA azzera la partecipazione in Arm H...
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: 14:10.


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