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

Concurrence et multi-thread Java Discussion :

Pb Interruption thread


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 68
    Par défaut Pb Interruption thread
    Bonjour,

    Pb : je ne passe jamais dans le bloc "catch(InterruptedException)".
    Info : toutes les méthodes sous-jacentes à run() ne traitent pas cette interruption mais la renvoie.
    Question : Pourquoi l'interruption n'est pas attrapée dans ma méthode run() ?

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    public class BalayageDlg extends JDialog implements Runnable 
    {
    .
    .
    private void initialize() {
    .
    .
          this.addWindowListener(new java.awt.event.WindowAdapter() {
    			public void windowClosing(java.awt.event.WindowEvent e) {
     
    				if(con!=null)
    				{
    					//fermer la connexion et rendre le port com
    					if(comThread!=null && comThread.isAlive())
    					{
    						//ordre d'interruption, doit être attrapé par le thread
    						comThread.interrupt();
    						//fermeture de la connexion et des listeners
    						con.setOpened(false);
    					}
    				}
    			}
    		});
     
    	}
     
     
    	public void run() {
    		comThread = Thread.currentThread();
    		try
    		{
    		if (this.isHF) 
    			balayageHf();
    		else
    			balayageFilaire();
    		}
    		catch(InterruptedException iex)
    		{
    			Thread.currentThread().interrupt();
    		}
    		parent.getBT_DetecterParc().setText(Hemolog.RES.getString("Detecter")+"("+parent.getNbActif()+")");
    		close();
    	}
    .
    .
    }
    Merci d'avance

  2. #2
    Membre éprouvé Avatar de bygui
    Homme Profil pro
    PLM/ALM
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : PLM/ALM
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    Bonjour,
    L'interruption de Thread semble bizarre. Et tu sur que ce soit la meilleur solution dans l'algorithme que tu as créé?
    Sinon, essais de rajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (Thread.interrupted()) {throw new InterruptedException();}

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 68
    Par défaut
    Disons que j'ai 2 solutions :

    Soit j'empêche l'utilisateur de quitter l'appli pendant la phase gérer par mes méthodes "balayageHf()" et "balayageFilaire()", auquel cas la question ne se pose plus.

    Soit l'utilisateur peut quitter mais le thread gérant ces deux méthodes doit impérativement se terminer sans quoi il pourrait continuer d'utiliser la liaison série quelques secondes de trop. De la à dire que c'est la meilleure solution... c'est du moins la seule que je connais si je tiens à mettre en oeuvre cette 2eme alternative.

    Quand à la solution que tu proposes, je ne vois pas trop comment ni ou la mettre en oeuvre...

    Pour info mes méthodes "balayage()" appellent plusieurs autre méthodes diffusants toutes des InterruptedException...

  4. #4
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    Je ne comprends pas exactement ton code. En effet dans la partie Listener, tu sembles vouloir interrompre le thread donc si tu l'interromps alors tu n'as rien à faire... De plus tu essaies de récupérer l'exception pour l'interrompre alors que sauf s'il y a des Thread en dessous, il sera déjà interrompu de manière naturelle.

    Il faut savoir que l'exception InterruptedException n'est pas lancée à chaque fois que le Thread est interrompu. Cette exception arrive uniquement s'il est dans un état d'attente et donc qu'il a été interrompu durant celui-ci :

    If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
    EDIT: Il faudrait vérifier le comportement mais si tu fermes ta fenêtres et que tu as mis comme opération de sortie EXIT_ON_CLOSE, je pense que les Threads sont interrompus.

  5. #5
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Si le problème est de faire le ménage proprement à la sortie, tu peux utiliser un shutdownHook (voir ici), qui exécutera du code en fin de programme.

  6. #6
    Membre éprouvé Avatar de bygui
    Homme Profil pro
    PLM/ALM
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : PLM/ALM
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    Utilise un bloque finally qui ferme correctement ton application...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 68
    Par défaut
    Bonjour,

    Darkxan :
    Tout à fait, dans le listener je cherche à interrompre le thread dont j'ai récupéré l'instance dans la méthode run().

    La piste du EXIT_ON_CLOSE, que j'avais déjà essayée se solde par une :
    "Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: defaultCloseOperation must be one of: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, or DISPOSE_ON_CLOSE".

    En effet il faut que le thread soit dans un état bloqué (wait, sleep, join) pour être interrompu... Je vais quand même pas faire une boucle infinie qui balance un ordre d'interruption jusqu'à tomber sur un moment ou le thread est bloqué et donc bien receptif !

    djsnipe : merci pour le lien

    Je vous tient au courant

  8. #8
    Membre éprouvé Avatar de bygui
    Homme Profil pro
    PLM/ALM
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : PLM/ALM
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    pourquoi ne termines tu pas le thread tout simplement alors?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void run() {
     while (!_shouldStop)
        {
           //ton traitement 
        }
    }

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 68
    Par défaut
    Parceque "mon traitement" consiste en l'appel d'une méthode une et une seule fois. D'ou l'inutilité de boucler dessus.

  10. #10
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Ce que je ferais ce serait une méthode stopThread qui fermerait les flux et autre ressources utilisées par la/les méthodes lancées dans le run().

    1 - Tu fais le ménage proprement et c'est ce que tu veux j'ai l'impression

    2 - Si tes méthodes ont besoin de ces ressources elles vont plantées (donc s'interrompre) avec une exception. Si la méthode stopThread a été appelée au préalable, tu ignores simplement l'exception qui est dans ce cas normale.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 68
    Par défaut
    Merci Bulbo,

    C'est le genre d'approche qui colle à mes besoins, j'ai mis en place une solution similaire à ce que tu dis, ça marche.

    Merci à tous de votre participation...

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

Discussions similaires

  1. Interruption et reprise d'un Thread
    Par michaeljeru dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 12/04/2007, 18h17
  2. Interruption et reprise d'un Thread
    Par Nuro dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 28/02/2007, 21h34
  3. Interruption d'un Thread
    Par doudblast dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 11/03/2006, 17h30
  4. interrupt() de la classe thread
    Par canigu dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 25/12/2005, 14h01
  5. Interruption de thread
    Par bigben89 dans le forum Windows
    Réponses: 2
    Dernier message: 13/10/2005, 10h41

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