IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

arreter Thread avec interrupt()


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut arreter Thread avec interrupt()
    Bonjour,

    voici le code de la classe utilisée par mon Thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class MonThread implements Runnable {
     
    	public MonThread(){
    		...
    	}
     
    	@Override
    	public void run(){
     
    		while(!Thread.currentThread().isInterrupted()){
    			... aucune fonctions bloquantes dans la boucle	
     
    		}
     
    	}
     
    }
    => j'ai beau lancer un .interrupt(), ça n'arrête pas mon Thread : ce n'est pas comme ça qu'on fait ?

  2. #2
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Pourquoi ne pas simplement utiliser un boolean

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class MonThread implements Runnable {
     
    	private boolean stop = false;
    	public MonThread(){
    		...
    	}
     
    	public void arretter(boolean stop){ this.stop = stop;}
     
    	@Override
    	public void run(){
     
    		while(!stop){
    			... aucune fonctions bloquantes dans la boucle	
     
    		}
     
    	}
     
    }

  3. #3
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    A noter que pour avoir quelque chose qui fonctionne correctement en multithread, il faudrait déclarer la variable stop volatile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private volatile boolean stop = false;

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    Citation Envoyé par Ivelios Voir le message
    Pourquoi ne pas simplement utiliser un boolean
    La classe Thread contient déjà une methode pour arrêter les Thread (qui est .interrupt()) alors pourquoi vouloir en créer d'autre ? => ça doit bien être possible de faire ça, non ?

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par boboss123 Voir le message
    La classe Thread contient déjà une methode pour arrêter les Thread (qui est .interrupt()) alors pourquoi vouloir en créer d'autre ? => ça doit bien être possible de faire ça, non ?
    En effet cela fonctionne parfaitement avec interrupt().

    Maintenant ton code comporte le strict minimum, et mis à part "ca marche pas" on ne sait rien du tout...

    a++

  6. #6
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    1) t'es sûr d'arréter le bon Thread ?
    2) es tu sûr qu'il n'y pas de méthode dans ta boucle qui sont réveillées par l'interruption et qui repositionne ensuite l'indicateur d'interruption (ex. Thread.sleep)

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    1) t'es sûr d'arréter le bon Thread ?
    2) es tu sûr qu'il n'y pas de méthode dans ta boucle qui sont réveillées par l'interruption et qui repositionne ensuite l'indicateur d'interruption (ex. Thread.sleep)
    J'ai un Thread.Sleep dans ma boucle : il faut faire quoi si cette methode repositionne le flag ?

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    il faut traiter le flag avant. Interrupt va positionner le flag et arreter la fonction blocante en cours en déclenchant un interruptedException. Si tu ne traite pas correctement cette exception, (tu l'ignore ou tu la loggue seulement par exemple) et que t'appelle ensuite d'autres méthodes, celles-ci risquent de repositionner le flag. Montre nous ton code qu'on puisse t'aider! C'est tout l'intéret d'utiliser ton propre boolen, c'est que t'es sur que les méthodes de l'api ne vont pas chipoter avec.

  9. #9
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par boboss123 Voir le message
    J'ai un Thread.Sleep dans ma boucle : il faut faire quoi si cette methode repositionne le flag ?
    Si ton thread est dans un etat slep(), la methode interrupt() va faire que sleep() va lancer une interruptedexception mais va ensuite remettre interrupted a false. Donc il faut que tu verifies cela dans le catch du sleep() pour arreter ton traitement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Thread] arreter un thread avec un Mouselistener
    Par Torg666 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 25/06/2009, 14h26
  2. thread avec wxworks
    Par moltes91 dans le forum wxWidgets
    Réponses: 12
    Dernier message: 08/04/2005, 14h56
  3. Thread avec C++
    Par pierrev1 dans le forum SDL
    Réponses: 3
    Dernier message: 18/03/2005, 13h59
  4. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15
  5. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo