Newsgroup: it.comp.java
Titolo: Thread e timeout]

Ho bisogno di imporre un timeout a un thread in modo di poterlo killare
allo scadere di tale tempo.
Ho pensato a un paio di metodi, tipo creare un secondo thread che tiene
conto del tempo e ne controlla la scadenza, alla scadenza killa il primo
thread e termina la sua eseguzione; un altro modo sarebbe includere al
codice del thread un Timer che allo scadere avvia TimerTask che ...
mohh?! essendo un altro thread figlio del principale(quello che deve
essere stoppato) non ha i privilegi per killarlo o sbaglio?!
Qualcuno ha qualche soluzione, magari + 'pulita'?
ciao,
Marco



Il metodo stop() della classe Thread è stato deprecato da tempo, sin da
prima che venisse pubblicata la versione 1.1 del JDK. Il motivo lo puoi
leggere su questa pagina:
http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
(non chiederlo... non esiste una traduzione italiana. Impara l'Inglese, fai
prima ;))
In breve, uccidere un thread da un altro thread è pericoloso e può portare
al blocco della tua applicazione.
Ricapitoliamo: perchè dovresti voler uccidere un thread?
1) perchè è bloccato
Se è bloccato, è un errore tuo. Inizia a debuggare seriamente...
2) perchè esegue in continuazione un loop senza uscita
In questo caso devi prevedere almeno una condizione di uscita (fosse anche
il controllo della presenza di un file) e usare un bel "return;"
assicurandoti di essere all'interno del metodo run(). Garantito che il tuo
thread muore senza sofferenze inutili ;)
In questo secondo caso ricade anche la tua richiesta. La condizione di
uscita potrebbe essere la verifica di una variabile booleana a livello di
oggetto... stai tranquillo, è la soluzione più pulita esistente al mondo:
--------------------- StoppableTask.java
public class StoppableTask implements Runnable {
   private volatile boolean timeToStop=false;
   private boolean running=false;
 
   public StoppableTask() {
      //prepari il tuo task per essere eseguito
   }
 
   public boolean isRunning() {return running;}
 
   public void stopTask() {timeToStop=true;}
 
   //questo metodo verrà avviato nel contesto del nuovo thread
   //vale a dire che NON DOVRAI ESSERE TE a chiamarlo
   public void run() {
      running=true;
      while(!timeToStop) {
         //Qui dovrai inserire le azioni che il thread eseguirà
         //in un loop continuo, finchè qualcuno dall'esterno non
         //chiamerà stopTask()
      }
      running=false;
   }
}
Ora ci vuole qualcuno che mandi in esecuzione il tuo task. Ecco un esempio:
--------------------- MainClass.java
public class MainClass {
   public static void main(String[] args) {
      StoppableTask mytask=new StoppableTask();
      Thread mythread=new Thread(mytask); //Prontiiiiiiiiiiiii.......
 
      mythread.start(); //VIA!!!!!
 
      //a questo punto la Java Virtual Machine crea il thread a livello
      //di Sistema Operativo e manda in esecuzione il task richiamando dal
      //suo interno il metodo run() di mytask.
 
      //Ora lasciamolo correre per un po' (diciamo 5 secondi)
      Thread.sleep(5000);
      //nota che ad addormentarsi è il thread che sta eseguendo main(),
      //mentre l'altro è libero di fare ciò che vuole.
 
      //è ora di scendere... avvisiamo il task
      mytask.stopTask();
 
      //Non si ferma subito, però è stato avvisato. Non appena il ciclo
      //all'interno di run() ricomincia, la condizione !timeToStop non è più
      //verificata e quindi l'esecuzione prosegue verso running=false
      //All'uscita da run(), il thread creato prima termina immediatamente
      //la sua corsa.
   }
}
Vedi un po' te...
-- 
Fermiamo Scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
  ---  
http://xenu.freewinds.cx
(per rispondere personalmente leva IlDitoDalCulo)

il problema e che le istruzioni che deve svolgere questo thread non sono 
in un ciclo.
per spiegarlo brevemente questo thread deve crittare del testo con 
diversi algoritmi...'e basta' diciamo...nessun ciclo x cui non posso 
controllare ogni volta la variabile booleana, sarebbe stato facile...
il motivo x cui voglio stopparlo e xchè ci mette troppo, ha un timeout e 
se ci mette troppo deve essere proprio DISINTEGRATO! penso a destroy() o 
a miothread= null , che dici.
cmq il problema e quello, devo fermarlo mentre sta svolgendo 
un'istruzione atomica.
cè un modo?
grazie ancora,
ciao

La situazione č piuttosto critica...prova con queste:
http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html
Magari c'č qualche classe che fa al caso tuo.
-- 
  -- + Setaceous Pig + --
http://megadix.users.mcs2.netarray.com/
http://www.jroller.com/page/megadix/



Fammi capire: la crittazione avviene tutta nel metodo run() oppure è
delegata ad una classe esterna? se riesci a portare il tutto in run() allora
puoi inserire il controllo della variabile booleana tra un'istruzione e
l'altra. Puoi postare un po' di codice?
-- 
Fermiamo Scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
 - 
http://xenu.freewinds.cx/
