Newsgroup: it.comp.java
Titolo: Come sincronizzare thread?

Ho creato un nuovo thread estendendo la classe Thread: a nuova classe
definisce un proprio metodo run(), che rappresenta codice che sarà esguito
dal nuovo thread.
Il problema è il seguente: tramite un'interfaccia grafica (due pulsanti)
deve essere possibile far partire e sospendere il thread: ora, dato che i
metodi stop(), resume(), suspend() sono dichiarati come deprecated nella
documentazione java com'è possibile sospendere e riprendere l'esecuzione del
thread usando wait() e notify() ?
Qualcuno ha qualche esempio con queste funzioni o esempi di sincronizzazione
tra thread?
Grazie
Tax
t...@racine.ra.it

 ha scritto nel messaggio
news:Z6xTb.8798$Mt6.3...@twister2.libero.it...




Avendo un problema simile a quello di Tax scrivo qui.
Con la stessa interfaccia di tax se non avessi alcun desiderio di poter  
riprendere l'esecuzione cosa posso usare per abortire il thread?
-- 
Manny Calavera
AntiSpam: CAVA²
Using M2, Opera's revolutionary e-mail client: 
http://www.opera.com/m2/

 ha scritto nel messaggio
news:opr2z791rhi9...@Djehwty.mes...

COme già scritto:
La cosa migliore è mettere una var boolean di stato all'interno del thread e
controllarla di tanto in tanto per vedere se è giunto il momento di
 terminare l'esecuzione (uscire dal run())
Se non vuoi usare una var puoi usare Thread.interrupt() per interrompere,
e nel thread interrotto testare di tanto in tanto (o con una serie di if o
nella condizione di un ciclo che presumo avrai)
isInterrupted() per uscire se restituisce true (non usare interrupted() che
ripulisce il flag di interruzione (vedi documentazione))

...

I meccanismi che hai a disposizione sono Thread.sleep()/interrupt() e
Object.wait()/notify().
Prima cosa, devi decidere la "granularita'" con cui vuoi poter
controllare lo stop del tuo thread o, in altri termini, determinare
quali operazioni del tuo thread sono da considerare atomiche
dall'esterno (ovvero una volta partite, finiscono a prescindere da
segnali di stop).
Con sleep/interrupt, nel tuo thread, definisci una variabile boolean
(volatile) "shutdown", definisci un metodo shutdown() (simile a
http://sadun-util.sourceforge.net/api/org/sadun/util/Terminable.html
)
e per ogni passo atomico, definisci un metodo privato nel tuo
thread/Runnable.
L'implementazione di shutdown() e' semplicemente { shutdown=true;
interrupt(); }.
run() avra' un corpo tipo:
 while(!shutdown) {
   passo1();
   if (shutdown) break; 
   passo2();  
   if (shutdown) break; 
   ...
   try {
     sleep(sleepTime); // se necessario 
   } catch(InterruptedException e) {
     if (!shutdown) e.printStackTrace();
   }  
 }
Se i passi sono molto veloci, per la maggior parte del tempo il thread
sara' in sleep, per cui puoi evitare i vari if.
Con wait/notify, semplicemente il tuo thread, al run(), crea un thread
S privato che non fa altro che effettuare una wait() - poi run() va
avanti come sopra.
Il codice che determina quando fermarsi (per esempio la GUI)
semplicemente invoca un metodo del thread principale che a sua volta
effettua una notify() su S - svegliandolo. Una volta sveglio, S esegue
un interrupt() sul thread "padre" e voila'. Se il tuo thread non deve
fare _nulla_ a meno che' non ci sia un segnale esterno, puoi evitare
il thread interno aggiuntivo e fare tutto il lavoro in run(). Un
esempio in codice e' a
http://cvs.sourceforge.net/viewcvs.py/sadun-util/Utility%20classes/source/com/deltax/util/listener/SignalQueue.java


Grazie mille!!!
Tax