Torna indietro   Hardware Upgrade Forum > Software > Programmazione

 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Amazon porta i colori sul suo Kindle da scrittura più grande: schermo Colorsoft a 11 pollici, processore quad-core, penna premium più reattiva e strumenti IA per le note, sono le note salienti. Il salto di prezzo rispetto al modello in bianco e nero si fa sentire, anche se la percezione è quella di trovarsi di fronte a un prodotto di fascia altissima, per veri appassionati
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint
Abbiamo intervistato Sumit Dhawan, CEO di Proofpoint, per capire come stia cambiando il mondo della sicurezza con l'avvento dell'intelligenza artificiale e con il ritmo sempre più serrato a cui vengono trovate vulnerabilità nel software. Un problema significativo, che richiederà del tempo per essere risolto (o quantomeno arginato)
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-07-2006, 16: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, 16: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, 16: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 16:23.
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 16: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, 17: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, 17: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, 17: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, 17: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, 17: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, 17: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, 17: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 17:30.
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 28-07-2006, 17: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, 17: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 28-07-2006, 23: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, 10: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 11:07.
cisc è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2006, 12: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, 13: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, 13: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, 14: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 14:56.
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2006, 14: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 14:49.
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più Dreame X60 Pro Ultra Complete: i bracci si esten...
La sovranità digitale non è...
ESS obbligatorio da luglio: il rivoluzio...
Batterie Tesla rubate direttamente fuori...
Il Governo statunitense anticipa di 5 an...
Steam Machine costa troppo? Non per i ba...
AWS e Azure sono gatekeeper e vanno rego...
Huawei presenta una nuova infrastruttura...
Logitech G e Activision uniscono le forz...
Snapdragon Summit 2026: ecco quando sara...
Sardegna, debutta il primo treno a idrog...
CXMT non ci salverà dai prezzi de...
Tidal contro la musica creata con l'inte...
Videproiettore compatto XGIMI MoGo 2 Pro...
Narwal rilancia su Amazon per il post-Pr...
Il regista di 47 Ronin ha frodato Netfli...
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: 19:28.


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