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 :

Thread, Arrête toi je le veux !


Sujet :

Concurrence et multi-thread Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut Thread, Arrête toi je le veux !
    Bonjour,
    J'aime pas les threads j'y comprend rien.
    Aidez-moi
    J'ai une gentille appli avec une belle interface graphique. A moment donné, un click vigoureux sur un bouton lance dans un thread un processus de génération complexe et long et dans un autre une barre de progression. Je veux qu'en clickant sur un bouton, je puisse stoper les deux.
    J'ai lu toute la doc que j'ai pu trouvé sur le sujet et je n'en regrette que plus stop() et destroy()
    Je ne comprends pas comme stopper ce Thread. Voici la fonction qui lance le thread de génération
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
          private void compute() {
                progressBar = new Barre();  
                flag = true;
                File tmpFile = null;
            if (!((JEditArea)tabbedPane.getSelectedComponent()).isSaved()){                            
                int n = JOptionPane.showOptionDialog(this,
                    "<html> Your file is unsaved. <br> Would you want to save it ?</html>",
                    "Warning",
                    JOptionPane.YES_NO_OPTION,
                    JOptionPane.WARNING_MESSAGE,
                    null,
                    options,
                    options[0]); 
                if (n==JOptionPane.YES_OPTION){
                    saveAsFile(); 
                    currentFile = ((JEditArea)tabbedPane.getSelectedComponent()).getFile();
                } else { // creation du fichier temp
                                              
    
                    currentFile = ((JEditArea)tabbedPane.getSelectedComponent()).createTempfile();   
                }
            } else {
                try {
                    currentFile = ((JEditArea)tabbedPane.getSelectedComponent()).getFile();
                } catch (NullPointerException npe) {
                    System.out.println("Null Pointer Exception");
                }
            }   
             
            (new Thread() {   
                public void run() {
                    
                        
                    while (flag) {                   
                    try {                    
                        File file = getCurrentFile();
                        TestParser testParser = new TestParser();             
                        if (file.canRead()){                        
                            try {
                                testParser.process(file);
                                stopBar();
                                displayInfo("ICAr generate with sucess");        
                            } catch (cdi.amparser.HandlerException he) {
                                System.out.println(he.getMessage());
                                he.printStackTrace();
                                stopBar();
                                displayInfo("Compilation Error");    
                            }
                            catch (Exception e) {
                            System.out.println(e.getMessage());
                            stopBar();
                            displayInfo("Compilation Error");  
                            
                        }
                    }
                  } catch (NullPointerException npe) {
                    stopBar();               
               }                              
          
                }
                }
                 
            }).start();  
           try {
                tmpFile.delete();
           } catch (NullPointerException npe) {}
        }
    (Le while marche pas bien evidemment je le sais bien)
    Merci d'avance (encore)

    Lain

  2. #2
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    ben quand tu va passer ton flag a "false", ton thread va sortir de la boucle et executer les instructions qui suivent puis se terminer.

    Ca ne te va pas comme ca ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Ben non.
    Pourquoi mon Thread bouclerait avant la fin ? Il boucle pas.
    Il fait gentiment toutes ces instructions sequentielement.
    Le while est une solution que j'ai trouvé de ci de là mais c'est bon que pour les process de type Timer ... :-(
    Je veux l'interrompre au milieu de la séquence.

  4. #4
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    a la premiere ligne je vois :
    while( flag )

    et il boucle pas ?
    tu peux tester l'intruction critique par un if(flag) exec...
    tu inhibes l'instruction comme ca, apres les quelques instructions executées ne vont pas ralentir le process...
    Sinon je ne vois pas

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Oublie le while
    Il boucle dans la mesure où une boucle boucle
    Mais moi je veux le stopper AVANT la fin de l'itération !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Y aurait-il moyen que je m'en sorte en utilisant la classe Runtime plutôt qu'un Thread ?

  7. #7
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Non, tu dois forcément finir ton traitement (donc tu fais des if(isInterrupted()) de temps en temps entre 2 traitements de temps en temps, pour lui donner des points où il peut s'arrêter...)...

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Bonjour,
    Ralalala mais ca me va pas du tout moi comme solution.
    Le traitement c'est juste un appel à une fonction d'une autre classe que je ne fais qu'utiliser ("pas toucher, mlle lain, pas toucher !!"). Si je l'ai flanquée dans un "Thread" c'est bien justement dans l'intention de pouvoir la killer n'importe quand !!! Ces traitements peuvent prendre des heures !!
    Ne me dites pas que je ne peux pas faire l'équivalent d'un bon kill -9 en Java ?????

  9. #9
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par mlle lain
    Bonjour,
    Ralalala mais ca me va pas du tout moi comme solution.
    Le traitement c'est juste un appel à une fonction d'une autre classe que je ne fais qu'utiliser ("pas toucher, mlle lain, pas toucher !!"). Si je l'ai flanquée dans un "Thread" c'est bien justement dans l'intention de pouvoir la killer n'importe quand !!! Ces traitements peuvent prendre des heures !!
    Ne me dites pas que je ne peux pas faire l'équivalent d'un bon kill -9 en Java ?????
    Durant le traitement, tu peux faire un test et renvoyer une exception InterruptedException, ce qui terminera ta méthode run... (avec éventuellement un try catch)...

  10. #10
    Membre confirmé Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Points : 474
    Points
    474
    Par défaut
    Citation Envoyé par ®om
    Durant le traitement, tu peux faire un test et renvoyer une exception InterruptedException, ce qui terminera ta méthode run... (avec éventuellement un try catch)...
    Justement, son soucis c'est qu'elle appelle une seule fonction hyper longue. Donc pas moyen de faire des tests d'interruption, si j'ai bien compris. Ca doit ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void run() {
       fonctionHyperLongue() ;
    }
    Y'a pas moyen de mettre de tests là dedans, à moins d'en insérer dans fonctionHyperLongue() justement. Mais comme elle a pas le droit de la modifier... je sais pô...

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Bon au moins on se comprend
    Effectivement, je veux/dois pas toucher à FonctionHyperLongue() mais de toute façon, je pourrais, ca me satisferait pas non plus car dans FonctionHyperLongue() y a des appels à ParsingHyperLong(), AnalyzingMegaComplexe(), CodageMoyenLong et PackagingPasCourt().
    Alors avec des tests sur un flag entre chaque appel aux fonctions par exemple, j'aurais le temps de boire un café et de refaire le monde avec les collègues avant que mon click sur le bouton "STOP" ait un effet ....

    Je trouve abérrant que ce soit si dur de trouver une solution à ça ...

  12. #12
    Membre confirmé Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Points : 474
    Points
    474
    Par défaut
    Citation Envoyé par mlle lain
    Bon au moins on se comprend
    Effectivement, je veux/dois pas toucher à FonctionHyperLongue() mais de toute façon, je pourrais, ca me satisferait pas non plus car dans FonctionHyperLongue() y a des appels à ParsingHyperLong(), AnalyzingMegaComplexe(), CodageMoyenLong et PackagingPasCourt().
    Alors avec des tests sur un flag entre chaque appel aux fonctions par exemple, j'aurais le temps de boire un café et de refaire le monde avec les collègues avant que mon click sur le bouton "STOP" ait un effet ....

    Je trouve abérrant que ce soit si dur de trouver une solution à ça ...
    Ben alors faut aussi ajouter des tests sur un flag dans ParsingHyperLong(), AnalyzingMegaComplexe(), CodageMoyenLong et PackagingPasCourt() !!
    Désolé je vois pas d'autre solution propre.

  13. #13
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Si une classe implements Closeable, est il possible d'envoyer un evénement de cloture?

  14. #14
    Membre chevronné
    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 : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par mlle lain
    Je trouve abérrant que ce soit si dur de trouver une solution à ça ...
    au contraire: voir la discussion sur la suppression des méthodes suspend, resume, stop de Thread.
    l'idée fondamentale est qu'un Thread est responsable pour prendre la décision de s'interrompre et qu'une interruption "extérieure" est trop dangereuse.
    donc: de l'extérieur on peut demander à un Thread de bien vouloir s'arréter ("s'il vous plait") et c'est au Thread cible de prendre la décision et donc de tester une condition.
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     
    public  class ThreadObeissant extends Thread{
    	private  boolean suspended = false ; // "volatile" pas nécessaire
    	private  boolean stopped ;// initialisé à false par défaut
     
           public ThreadObeissant() { super() ;} 
    /*
           public ThreadObeissant(Runnable rr) { // pas tres pratique dans ce cas tres particulier
              super(rr) ;
          }
    */
     
    	//////////////////////////////////////////////////////////////////////////
    	/// ces trois méthodes sont appelés par d'autres processus que le Thread courant!
    	//////////////////////////////////////////////////////////////////////////
    	public  synchronized void suspendRequest() {
    			checkAccess() ; //methode speciale limitant l'acces au ThreadGroup
    			suspended = true ;
    	}
     
    	public  synchronized void stopRequest() {
    			checkAccess() ;
    			stopped = true ;
    			notify() ; // utile si suspended
    	}
     
    	public  synchronized void resumeRequest() {
    			checkAccess() ;
    			suspended =false ;
    			notify() ;
    		}
    	//////////////////////////////////////////////////////////////////////////
     
    	/** permet de tester si le thread peut continuer
                    * l'appel est bloquant si le Thread est suspendu
                    *<P> si répond "false" on doit impérativement sortir du run
                    * <P> IMPORTANT : cette méthode ne peut être appelée que du processus courant
                    * décrit par le "ThreadObeissant" (contrairement aux méthodes ***request).
                    */
    	protected synchronized boolean going() {
    		if( this != currentThread()) {// ceinture et bretelles
    			throw new SecurityException("external thread cannot call going()") ;
    		}
    		while (suspended && !stopped) {
    				try {
    					wait() ;
    				} catch (InterruptedException exc) {
    					// stopped = true ; à décider
    				}
    			}
    		return !stopped ;
    		// return (!stopped) && (!isInterrupted()) ;
    	}
     
     
    }

  15. #15
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par professeur shadoko
    au contraire: voir la discussion sur la suppression des méthodes suspend, resume, stop de Thread.
    l'idée fondamentale est qu'un Thread est responsable pour prendre la décision de s'interrompre et qu'une interruption "extérieure" est trop dangereuse.
    Hum ! Je n'aurais pas réussi à expliquer cela aussi clairement... (je risque de te piquer cette explication dans le futur ).


    Pour en revenir à la méthode stop(), elle est dangereuse car elle peut laisser l'application dans un état incohérent (instance mal initialisé ou dans un état incorrect), et cela pourrait avoir des répercussions sur les autres threads de ton applications.

    Le kill -9 est nettement moins dangereux car il tue toutes l'applications... il n'y a pas de risque de se retrouver dans un état incohérent...


    Quel type de traitements tu effectues dans ton thread ? Cela pourrait nous aider à trouver une solution

    a++

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Ben comme je l'ai dit précédemment (avant une certaine discussion sur le mérite comparée des méthodes de sorties d'une boucle while ) Je ne mets dans mon run qu'un appel à une fonction.

    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
    public void run() {
                try {                    
                    File file = getCurrentFile();
                    TestParser testParser = new TestParser();             
                        if (file.canRead()){                        
                            try {
                                testParser.process(file);
                                stopBar();
                                displayInfo("ICAr generate with sucess");        
                            } catch (cdi.amparser.HandlerException he) {
                                System.out.println(he.getMessage());
                                he.printStackTrace();
                                stopBar();
                                displayInfo("Compilation Error");    
                            }
                            catch (Exception e) {
                            System.out.println(e.getMessage());
                            stopBar();
                            displayInfo("Compilation Error");  
                            
                        }
                    }
                  } catch (NullPointerException npe) {
                        stopBar();               
                  }                                    
            }
    Alors même si je comprends la principe, je vois pas quand le thread se rencadre sur l'état de la variable ..

  17. #17
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mlle lain
    Ben comme je l'ai dit précédemment (avant une certaine discussion sur le mérite comparée des méthodes de sorties d'une boucle while ) Je ne mets dans mon run qu'un appel à une fonction.
    Oui j'ai bien lu ceci !

    que fait cette fonction ???

    a++

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Du parsing de fichier et de la génération de code. Y a 4 ou 5 appels à d'autres méthodes.
    Mais je ne suis pas censée toucher à cette classe

  19. #19
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mlle lain
    Du parsing de fichier et de la génération de code.
    Mais je ne suis pas censée toucher à cette classe
    Génération de code dans des fichiers ?

    Il faudrait savoir si la gestion des IO est interruptible, comme par exemple en utilisant les FileChannel...

    En effet ces derniers permettent de remonter une exception lorsque le thread est interrupted...


    Maintenant si tu ne peux pas modifier ce code alors il n'y a pas vraiment de solution... a moins d'appeller Thread.stop() avec tout les risques que cela comporte...


    a++

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Erf, ....
    je vois pas effectivement comment je peux faire autrement.

    Le problème se posera à la prochaine jdk ... si suppression y a ...

Discussions similaires

  1. [thread] Arrêt d'un thread en sommeil
    Par ChipsterJulien dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 06/06/2010, 16h04
  2. Réponses: 2
    Dernier message: 05/03/2007, 16h45
  3. Réponses: 7
    Dernier message: 18/09/2006, 22h01
  4. Arrêt de thread
    Par mr.saucisse dans le forum MFC
    Réponses: 5
    Dernier message: 29/01/2006, 21h02
  5. Réponses: 8
    Dernier message: 19/01/2006, 15h00

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