Newsgroup: it.comp.java
Titolo: Applet e thread

Buona sera a tutti.
Premetto che è la prima volta che mi trovo a dover affrontare i
thread.
Ho un applet che deve aggiornare automaticamente i dati (tramite web
service) ogni 5 minuti. Per ottenere l'aggiornamento ho optato per
l'uso dei thread. Se sapete un modo più elegante e/o veloce fatevi
avanti. :)
In pratica ho
public class Appl extends Applet implements Runnable{
	protected Log log = new Log(Log.INFO);
	protected Thread thread = null;
	...
	public Appl(){
		super();
	}
	public void init(){
		super.init();
		...
	}
 
	public void destroy(){
		super.destroy();
	}
	public final synchronized void update (Graphics g){
		//richiamo alle funzioni di calcolo e prelievo dati
		...
	}
	public void start(){
		update(this.getGraphics());
	}
	public void run(){
	}
	public void stop(){
	}
}
Attualmente in questo stato l'applet parte e si disegna correttamente.
Per aggiungere le funzionalità di refresh, avevo pensato di modificare
i metodi:
	public void start(){
		update(this.getGraphics());
		if(thread == null){
			thread = new Thread(this);
			thread.start();
		}
	}
	public void run(){
		while (true){
			try{
				repaint();
				Thread.sleep(300000);
			}catch (InterruptedException e){
				stop();
			}
		}
	}
	public void stop(){
		if (thread != null){
			thread.stop();
			thread = null;
		}
	}
Il problema è che sul metodo stop, WSAD mi fa notare che il metodo
stop() usato in questo modo è deprecato. Vado a leggere la
documentazione ed ecco che dice (a quanto ho capito) che richiamando
object.stop(), si rischia di lasciare bloccato qualche monitor e non
svuotare bene la memoria. Consiglia di usare una variabile interna ma
qui non ho capito come fare.
Qualche consiglio?
Grazie a tutti D.

E' meglio che non implementi Runnable nella classe dell'applet..
ti troverai molto meglio seaggiungi una classe separata che implementa
Runnable e implementi li il metodo run
quindi nel metodo init dell'applet lanci il thread
il metodo run della classe che implementa Runnable sara'
un while che chiama sleep per 5 minuti e' poi fa' quel che
deve fare.. quindi torna in sleep.. e cosi' via.
Ciao.
-- 
                Roberto Nunnari -software engineer-
                      robi AT 
nunnisoft.ch
 
http://www.nunnisoft.ch
   Residenza Boschetto 12           tel/fax: 
+41-91-6046511
   6935 Bosco Luganese        """    mobile: 
+41-76-3208561
   Switzerland               (o o)
========================oOO==(_)==OOo========================

 Qualche consiglio?
Vedi righe inserite intrammezzate sopra.

 E' meglio che non implementi Runnable nella classe dell'applet..
Ovviamente "De gustibus..." non si discute.
Pero', a mio modestissimo e umile parere, e' una gran buona cosa 
implementare Runnable proprio nella classe dell'applet:
tra l'altro, in questo modo, thread e applet condivono le stesse 
variabili d'istanza (ad esempio la variabile boolean stopped
usabile per bloccare il thread!).
Ma ripeto: de gustibus non disputandum est.
- Dario

...

Ho optato per questa soluzione in quanto era la più indolore (allo
stato attuale di sviluppo) e mi è parsa quella più chiara ed
immediata. Forse perchè l'avevo pensata anche io ma volevo una
conferma :)
Ciao e grazie a tutti D.