Newsgroup: it.comp.java
Titolo: uccidere un thread

Ciao a tutti volevo chiedervi ...come posso far "morire" un thread lanciato
da una classe ??
In modo particolare io ho un thread che ne crea un altro ogni 24 ore, ma
prima di lanciare quello nuovo vorrei killare quello precedente ... non
esiste un metodo del tipo kill(String NomeThread) oppure kill( int Pid )
???
grazie

 ???
interrupt() :
http://java.sun.com/j2se/1.4.1/docs/api/java/lang/Thread.html#interrupt()
Gaetano



no.
fai cosi':
public void run() {
	while(!morto) {
		//roba
	}
}
void muori(boolean bastardo)
{
	morto = true;
}
dal thread principale chiami "muori". Se il thread che deve morire č in
sleep allora lo puoi risvegliare con interrupt, se č bloccato in una
operazione di I/O bloccante allora non č detto che interrupt funzioni:
ad es. per le socket č necessario chiudergli la socket o lo stream sotto
il naso.
ciao
-- 
Seti@Home Java Applets
http://maruko.webhop.net/

Un tipo chiamato Diego ha scritto:

nomethread.interrupt()
-- 
----Mr Fabio----
--Nel mondo esistono 10 tipi di persone:
quelle che pensano in binario e quelle che non.--

 il naso.
lo risveglio ??? come ?? perchè io ho pravato a fare ...
if (sendMail != null && sendMail.isAlive()) {
System.out.println("sendMail is Alive !");
sendMail.interrupt();
System.out.println("sendMail is Die !");
}
ma mi lancia l'eccezione interrupt sleep .... perchè in effetti dall'altra
parte il thread sendMail sta dormendo ....
devo prima sbloccarlo ma non so con cosa ho visti nella api che esiste un
metodo join ma non ho capito come funziona !
grazie
diego


e' giusto. un thread in sleep risvegliato con interrupt lancia
quell'exception. Fai un try catch.
il metodo isAlive non e' precisissimo nel dirti se il thread e' vivo o
no, a me apparivano vivi thread che per me dovrebbero essere morti.
Direi che sia dovuto al fatto che un thread che ha finito il run impiega
un po' a morire a tutti gli effetti agli occhi della virtual machine.
Comunque ho risolto usando mie variabili:
public void run()
{
 morto = false;	
 while(!muori) {
 }
 morto = true;
}
public boolean isMorto()
{
 return morto;
}
public void muori(boolean bastardo)
{
 muori = true;
}
poi normalmente faccio un ciclo;
while(! threadTalteiTali.isMorto()) {
//sleep avendo cura di terminare il ciclo dopo un certo tempo (timeout)
//se il thread non vuole morire


 }
scusa la mia ignoranaza ma non credo di poter applicare questo tuo codice
...perchè
io ho due thread
uno si chiama notificaScadenze e l'altro sendMail ...sono due classi ben
distinte che estendono Thread e implementano run() ...allora funziona cosi'
:
notificaScadenze crea un albero ordinato R/B interrogando un DB ed inserendo
delle date di scadenza nel formato aaaammgghhmm... una volta al giorno ...
lo faccio sleep() per 24 ore ...prima di dormire lancia pero' un altro
thread sendMail che dato l'albero spedisce delle mail  ... anche questo
thread si risveglia solo 5 sec prima di ogni scadenza ...in modo tale da non
consumare troppi cicli di clock per niente ... il problema nasce quando per
esempio lancio la prima volta notificaScadenze dove per esempio l'albero
contiene due date di scadenza molto vicine diciamo fra 5 minuti una e 7
minuti l'altra ed un'altra scadenza molto lontana come per esempio fra 2
giorni .... fin tanto che quest'ultima scadenza non viene notificata il
thread sendMail non muore .... il fatto è che il giorno dopo
notificaScadenza si risveglierà e creerà un nuovo albero contenente ancora
la stessa scadenza ... la quale quindi verrà notificata due volte .....
non so quanto capirai  da quello che ti ho scritto .... boh
grazie dell'aiuto  !!!
diego


mah... a naso... in notificaScadenza metti un riferimento all'altro
thread e nell'altro thread metti un paio di metodi, uno per aggiornare
la lista delle notifiche (a meno che non sia già condivisa) e uno per
risvegliarlo. L'altro thread si sveglia, guarda le scadenze aggiornate e
fa quello che deve fare... non capisco bene perche' tu voglia per forza
ucciderlo e ricrearlo... in ogni caso, se hai un riferimento ad esso in
notificaScadenze allora puoi risvegliarlo e farlo morire col meccanismo
che ho detto.


 ha scritto nel messaggio
news:Y7UKa.258638$g92.5...@news2.tin.it...


> > }
mangia ch'č buono, mangia ch'č buono
ahhahaha

ahhahaha
???
