Interrompre un thread correctement
Fermé
reywas
Messages postés
19
Date d'inscription
dimanche 29 août 2010
Statut
Membre
Dernière intervention
1 mars 2013
-
Modifié par reywas le 13/02/2013 à 14:28
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 13 févr. 2013 à 17:39
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 13 févr. 2013 à 17:39
A voir également:
- Interrompre un thread correctement
- La page n’est pas redirigée correctement ✓ - Forum Mozilla Firefox
- La fenetre actuelle est trop petite pour afficher correctement cette feuille - Forum Google Docs
- Chrome ne s'est pas correctement arrêté - Forum Google Chrome
- Un périphérique attaché au système ne fonctionne pas correctement - Windows 11
- Le logiciel fortinet n'a pas été installé correctement - Forum Virus
4 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
13 févr. 2013 à 14:49
13 févr. 2013 à 14:49
extends Thread implements Runnable
Thread implémente déjà Runnable, ce n'est pas la peine de le rappeler.
Thread implémente déjà Runnable, ce n'est pas la peine de le rappeler.
public static void main(String[] args) throws InterruptedException { Thread t = new MonObjet(); t.start(); Thread.sleep(5000); // Arrêt spécifique du Thread t if (!t.isInterrupted()) t.interrupt(); // Arrêt de la machine virtuelle (tous les Thread sont arrêtés) System.exit(0); }
reywas
Messages postés
19
Date d'inscription
dimanche 29 août 2010
Statut
Membre
Dernière intervention
1 mars 2013
1
Modifié par reywas le 13/02/2013 à 16:17
Modifié par reywas le 13/02/2013 à 16:17
Merci mais cela ne fonctionne pas :/
t.interrupt() est bien exécuté mais le thread continue de tourner.
En effet, je vois s'afficher le message "boucle" pendant 5 secondes, jusque là tout est normal. Au bout des 5 secondes comme le thread n'est pas interrompu je vois le message "1" s'afficher, toujours comme prévu. Ensuite le thread est interrompu et je ne vois pas s'afficher le message "2", mais le thread tourne toujours puisque le message "boucle" continue d'apparaître...
Je veux vraiment que le thread soit détruit, qu'il s'arrête complètement et qu'il ne continue pas de tourner dans le vent.
Comment faire ?
t.interrupt() est bien exécuté mais le thread continue de tourner.
public class MonProgramme { public static void main(String[] args) throws InterruptedException { Thread t = new MonObjet(); t.start(); Thread.sleep(5000); if (!t.isInterrupted()) { System.out.println("1"); t.interrupt();} if (!t.isInterrupted()) { System.out.println("2"); } } } public class MonObjet extends Thread { public void run() { System.out.println("Le thread vient de se lancer !"); while(true) { System.out.println("Boucle"); try { Thread.sleep(500); }catch(Exception e){} } System.out.println("Le thread vient de se terminer !"); } }
En effet, je vois s'afficher le message "boucle" pendant 5 secondes, jusque là tout est normal. Au bout des 5 secondes comme le thread n'est pas interrompu je vois le message "1" s'afficher, toujours comme prévu. Ensuite le thread est interrompu et je ne vois pas s'afficher le message "2", mais le thread tourne toujours puisque le message "boucle" continue d'apparaître...
Je veux vraiment que le thread soit détruit, qu'il s'arrête complètement et qu'il ne continue pas de tourner dans le vent.
Comment faire ?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié par KX le 13/02/2013 à 16:38
Modifié par KX le 13/02/2013 à 16:38
Lorsqu'on utilise la méthode interrupt, une exception InterruptedException est envoyée au Thread, or cette exception tu l'as court-circuité en faisant un try/catch qui ne fait rien.
Remarque : même si c'est un peu "violent" pour une utilisation courante, je te conseille de mettre systématiquement le System.exit(0) à la fin de ton main, afin d'être sûr que tous les threads du programme seront arrêtés même si tes interruptions échouent.
public void run() { System.out.println("Le thread démarre !"); try { while(true) { System.out.println("Boucle"); Thread.sleep(500); } } catch (InterruptedException e) { System.out.println(e.getMessage()); } System.out.println("Le thread se termine !"); }
Remarque : même si c'est un peu "violent" pour une utilisation courante, je te conseille de mettre systématiquement le System.exit(0) à la fin de ton main, afin d'être sûr que tous les threads du programme seront arrêtés même si tes interruptions échouent.
reywas
Messages postés
19
Date d'inscription
dimanche 29 août 2010
Statut
Membre
Dernière intervention
1 mars 2013
1
Modifié par reywas le 13/02/2013 à 17:23
Modifié par reywas le 13/02/2013 à 17:23
Grand merci pour ton aide mais ça ne fonctionne toujours pas. En effet sur l'exemple que tu donnes c'est bon mais dés qu'on enlève le sleep dans le while alors ça ne s'interrompt plus.
Or la méthode qui pose problème, celle qui crée la boucle infinie (voir premier post pour se remémorrer) n'a probablement pas de sleep.
Donc le code suivant ne fonctionne pas : (D'ailleurs il compile même pas)
Comment puis-je régler cela ?
Or la méthode qui pose problème, celle qui crée la boucle infinie (voir premier post pour se remémorrer) n'a probablement pas de sleep.
Donc le code suivant ne fonctionne pas : (D'ailleurs il compile même pas)
public class MonProgramme { public static void main(String[] args) throws InterruptedException { Thread t = new MonObjet(); t.start(); Thread.sleep(5000); t.interrupt(); } } public class MonObjet extends Thread { public void run() { try { Librairie.boucle_infinie(); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } }
Comment puis-je régler cela ?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
13 févr. 2013 à 17:39
13 févr. 2013 à 17:39
Voici ce qu'indique la documentation officielle : Java Thread Primitive Deprecation
Cela signifie que si le code est bien fait, un thread devrait prendre en charge ce changement d'état, c'est à dire tester lui même s'il est ou non interrompu et s'arrêter en conséquence.
Mais comme indiqué dans la documentation, il n'y a pas de méthode générale si cette opération échoue. Il reste cependant la possibilité de faire le System.exit(0) qui lui marchera forcément, mais ne fera pas dans le détail puisqu'il arrêtera tout le programme.
What if a thread doesn't respond to Thread.interrupt?
In some cases, you can use application specific tricks. For example, if a thread is waiting on a known socket, you can close the socket to cause the thread to return immediately. Unfortunately, there really isn't any technique that works in general. It should be noted that in all situations where a waiting thread doesn't respond to Thread.interrupt, it wouldn't respond to Thread.stop either. Such cases include deliberate denial-of-service attacks, and I/O operations for which thread.stop and thread.interrupt do not work properly.
Cela signifie que si le code est bien fait, un thread devrait prendre en charge ce changement d'état, c'est à dire tester lui même s'il est ou non interrompu et s'arrêter en conséquence.
public void run() { System.out.println("Le thread démarre !"); while (true) { System.out.println("Boucle"); if (isInterrupted()) break; /* try { Thread.sleep(500); } catch (InterruptedException e) { break; } */ } System.out.println("Le thread s'arrete"); }
Mais comme indiqué dans la documentation, il n'y a pas de méthode générale si cette opération échoue. Il reste cependant la possibilité de faire le System.exit(0) qui lui marchera forcément, mais ne fera pas dans le détail puisqu'il arrêtera tout le programme.