[ THREAD ] Arréter un thread qui exécute une commande bloquante.

Arréter un thread qui exécute une commande bloquante. [ THREAD ] - Java - Programmation

Marsh Posté le 27-02-2008 à 17:12:20    

Bonjour,
 
Je suis en gros dans le cas suivant :

Citation :

class MonThread extends Thread {
 MonThread() {}
 public void run() {
  try {
   // instructions avant commande bloquante
   Thread.sleep(10000);  
   // instructions après commande bloquante
  }
  catch(InterruptedException ie) {}
 }
}


 
En réalité dans mon cas à la place de sleep() j'ai une fonction qui fait tout plein de chose et qui à un temps d'exécution aléatoire.
 
Je voudrais à n'importe quel moment stopper ce Thread. J'ai pensé à la solution qui consiste à créer une fonction qui lève une interruption pour rentrer dans le catch :

Citation :

class MonThread extends Thread {
 private boolean fin = false;
 MonThread() {}
 public void run() {
  try {
   // instructions avant commande bloquante
   testFin();
   Thread.sleep(10000);  
   testFin();
   // instructions après commande bloquante
  }
  catch(InterruptedException ie) {}
 }
 public void testFin() throws InterruptedException {
   if (fin == true) {
    throw new InterruptedException();
    }
  }  
 public void signalerFin() {
  fin = true;
  }
}


 
Cependant l'exception n'est levée qu'après la fin de l'exécution de mon instruction bloquante. Ce qui dans mon cas n'est pas bon car je voudrais qu'au moment où j'ai décide de stopper mon Thread, il s'arrête, et pas qu'il s'arrête à la fin d'un instruction ayant un temps d'exécution aléatoire.
 
Si vous avez des idées, faite passer svp :)
dieZ

Reply

Marsh Posté le 27-02-2008 à 17:12:20   

Reply

Marsh Posté le 03-03-2008 à 12:02:17    

Pourquoi veux tu arreter le thread, tu ne peux pas le laisser se terminer normalement ?
Sinon je ne crois pas que tu puisses arreter un thread en lui envoyant un signal sans risquer un dead-lock.


---------------
Light is right
Reply

Marsh Posté le 17-03-2008 à 17:18:30    

La technique habituelle est celle que tu as choisie (attribut booléen "fin" ), mais il faut aussi que le code de ta fonction bloquante teste très régulièrement "if (stopNow) { ... }". Ce qui veut dire, oui, truffer son code de "if (stopNow) { ... }" (ou d'appels à une méthode "checkStopNow()" qui ferait le boulot, ce qui revient à peu près au même).
 
Normalement, seul le thread peut décider de sa propre fin, car il a très souvent pris des ressources qui doivent être libérées, et il a donc très souvent des libérations de ressources à faire une fois qu'il a reçu l'information de s'arrêter.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed