Newsgroup: it.comp.java
Titolo: Problema con un Thread..

Ho scritto un applet dove al suo interno ha un  Thread che mi fa determinate
azioni ogni tot di secondi.. A  volte questo Thread si interompe... Cioe'
non viene piu' eseguito.. Da cosa puo' dipendere questa interruzione??
Esiste un sistema per farlo ripartire??
Il codice a grandi linee..
public class Malo extends Applet implements Runnable
{ 
   Thread runner;
   String Punto; 
    public void init()  
     { 
setBackground(Color.white);
}
   public void paint(Graphics g) 
     {
 g.setColor(Color.black);
 g.drawString(Punto,15,10); 
}
   public void start()
    {
        if(runner == null)
        {
           runner = new Thread(this);
            runner.start();
        }
    }
    public void stop()
    {
        if(runner != null)
        {
            runner.stop();
            runner.destroy(); 
            runner = null;
        }
    }
    public void destroy()
    {
        System.gc();
        super.destroy();
    }
    private void pause(int sleeper)
    {
        try
        {
            Thread.sleep(sleeper);
            return;
        }
        catch(InterruptedException _ex)
        {
            return;
        }
    }
    public void run()
    {
while (true) {
Punto = "O";
repaint();
pause(800);
Punto = " ";
repaint();  
pause(800);
 
}
}
}
Ho postato solo il necessario... Funziona.. ma come gia' detto a volte si interompe..
Inoltre in compilazione mi da sempre un Deprecations !!! Quali sono i metodi per gestirlo bene???
Ringrazio in anticipo chi mi puo' dare una mano..
Ciao MaloMax

Ho cercato un po' nella documentazione di Java 2..
Ho trovato questo che ho gia' adattato alla mia Applet...
You can avoid the use of Thread.stop by replacing the applet's stop and run
methods with:
    private volatile Thread blinker;
    public void start() {
        blinker = new Thread(this);
        blinker.start();
    }
    public void stop() {
        blinker = null;
    }
    public void run() {
        Thread thisThread = Thread.currentThread();
        while (blinker == thisThread) {
            try {
                thisThread.sleep(interval);
            } catch (InterruptedException e){
            }
            repaint();
        }
Ora non mi da piu' il deprecation.. Ma mi si pianta ancora..
( proprio in questo momento.. Sara'  Outlook ?? )
Cosa significa 'volatile' ?? ( chiedo troppo?? )
Come posso farlo ripartire ?? Ho provato inserendo..
        if(blinker == null)
        {
             blinker.start();
        }
In un evento ...
Solo che in questo momento sta' andando.. e non ne so l' effetto!!!
Funzionera' ??
Non credo.. E' meglio :
        Thread thisThread = Thread.currentThread();
        if (blinker != thisThread) {
             blinker.start();
        }
Dovrei provare... ma quando si deve piantare ... non lo fa!!!!
Fa beh... Ciao Maloxxx

 wrote in message
987222$ej0$1...@nreadA.inwind.it...


Ciao Francesco..
Grazie per la tua risposta... Ma non sono riuscito ad abilitare la Consol ..
In avanzate sotto Java VM ho solo due voci..Tutte e due abilitate..
Cmq penso di aver capito.. Il problema era nel codice che non ho postato..
 40 kb )
Nel Tutorial del sito della Sun ..Ho letto che i Thread si fermano per 3
motivi..
Quando aspettano un evento.. Ripartono quando succede l' evento ..
Quando li si mette in attesa con sleep(); .... Riparte quando il tempo di
attesa e' terminato..
E quando aspettano un I/O ... Riparte quando l' I/O e' terminato..
Inserendo un isAlive(); mi dice che il Thread e' in esecuzione anche quando
mi si ferma..
La mia Applet fa un collegamento al sito ... ( Quindi I/O ).. ogni tot
secondi...
O quando succedono determinati eventi...
Nel thread avevo una chiamata a Collegamento(); ...
Probabilmente si pianta quando il collegamento non riesce..
E resta in attesa anche se altri collegamenti successivi vanno a buon
fine...
In collegamento ho un try {} catch (IOException e) {}
Ma in catch{} non posso fermare il thread per poi farlo ripartire
( almeno penso, se e' in attesa ... Portandolo a null non credo termini )...
Penso che inserirņ il codice del collegamento in run ...
E in catch ci metto un bel return ...
Elimino start e faccio partire il Thread da init...
( cosi se non riesce un collegamento si dovrebbe interrompere )
Poi controllerņ a determinati eventi ( tipo quando il mouse entra nella
Applet ) se
il Thread e' in esecuzione.. Se no lo riavio...
Provo provo.. imparo imparo....
Altri consigli ???
Grazie ancora...
Ciao MaloMax