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 :

Arret d'un thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 8
    Par défaut Arret d'un thread
    Bonjour,

    Dans le cadre de mon projet il m'est nécessaire de créer un thread, donc j'ai écris ce code mais voila un petit soucis, si je crée par exemple un thread t, quand j'appelle la méthode t.start(); le thread ce lance correctement mais impossible de le stoppe avec la méthode t.arreter(); si quelqu'un à une idée



    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
    package msxy05.jeuvie;
     
    public class MonThread extends Thread{
    	private Monde monde;
    	private MonCanvas canva;
    	private boolean actif = true;
     
    	public MonThread(Monde monde,MonCanvas canva){
    		this.monde=monde;
    		this.canva=canva;	
    	}
     
    	 public void run() {
    		 while(actif){
    			 this.monde.Nextgeneration();
    			 this.canva.paintAll(this.canva.getGraphics());
    			  }
    		  }	  
    	 public void arreter() {
    		 actif=false;
    	 }
    }

    Cordialement
    Serni

    ps: j'ai poste dans cette rubrique je sais pas trop si c'est la mieux indiqué :/

  2. #2
    Membre chevronné Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Par défaut
    Je t'invite a consulter la javadoc de la méthode Thread.stop qui est déprécié et donc qui ne doit pas être utilisé. Cepedant, la doc donne toutes les infos dont tu as besoin.

    Tu peux aussi regarder ce post (c'est le premier lien quand tu cherche "Thread stop" dans google)


    EDIT: j'ai lu un peu trop rapidement ton post et me suis rendu compte que je ne répondait pas a ta question.
    J'ai donc repris ton code qui fonctionne très bien chez moi.
    Quel est exactement ton problème ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 8
    Par défaut
    Merci de la réponse,

    quand j'appelle "arreter();" le thread continue de fonctionner voila mon problème

  4. #4
    Membre chevronné Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Par défaut
    si tu prend ce code (tu remarqueras que c'est le même que le tiens a peu de chose prés) :
    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
    package thread;
     
    public class StartStop {
     
    	private final static Object LOCK = new Object();
     
    	private final static void attendre(long timeout) {
    		synchronized (LOCK) {
    			try {
    				LOCK.wait(timeout);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
     
    	public static class MonThread extends Thread {
    		private boolean actif = true;
     
    		public MonThread() {
    		}
     
    		public void run() {
    			while (actif) {
    				System.out.println("actif");
    				attendre(1000);
    			}
    			System.out.println("inactif");
    		}
     
    		public void arreter() {
    			actif = false;
    		}
    	}
     
    	public static void main(String[] args) {
    		System.out.println("debut");
    		MonThread t = new MonThread();
    		t.start();
    		attendre(2000);
    		t.arreter();
    		try {
    			t.join();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		attendre(1000);
    		System.out.println("fin");
    	}
    }
    Ca fonctionne bien correctement.
    A mon avis, le problème ne vient de ton algo mais de l'interface graphique qu'il faut fermer explicitement.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 8
    Par défaut
    Je ne comprend pas trop le fait de fermer mon "interface graphique explicitement"

    pour expliquer le contexte mon thread me sert à lancer la simulation de ma grille qui ce trouve sur mon interface et je veux simplement stope la simulation de la grille (donc le thread) mais pas fermer l'interface

  6. #6
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Juste une question, c'est cmt tu arretes ton thread?
    Est ce que t'as un bouton ou un endroit explicite dans ton appli qui dit "arreter simulation par exemple"?

  7. #7
    Membre chevronné Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Par défaut
    Citation Envoyé par Serniratte Voir le message
    je veux simplement stope la simulation de la grille (donc le thread) mais pas fermer l'interface
    +1

    As tu essayé de débuguer ton application (en mode pas à pas) pour voir pour quel raison ton thread n'est pas arrété (il n'y a aucune raison qu'il continue de tourner)
    Peut être que tu n'appel pas la méthode arreter sur le bon thread ? (je ne vois pas pouquoi mais bon...) Es tu sur que la méthode arreter est appelée correctement ?

  8. #8
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par Serniratte Voir le message
    Je ne comprend pas trop le fait de fermer mon "interface graphique explicitement"

    pour expliquer le contexte mon thread me sert à lancer la simulation de ma grille qui ce trouve sur mon interface et je veux simplement stope la simulation de la grille (donc le thread) mais pas fermer l'interface
    POur arreter ton thread, il faut que la variable actif soit vue / appelée de l'extérieur. En gros, il faut qu'elle soit publique.
    Donc, il faut la protéger avec des sémaphores

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 8
    Par défaut
    Alors en fait mon thread s'arrête effectivement avec l'appuie sur un bouton stop.

    J'ai essayé un débugage la méthode est bien appelé est le boolean est bien modifié (il passe bien de "true" a "false" grâce la méthode arreter)

    Pour ce qui est des sémaphores ca dépasse mes compétences la O_o

  10. #10
    Membre chevronné Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Par défaut
    Citation Envoyé par Serniratte Voir le message
    Alors en fait mon thread s'arrête effectivement avec l'appuie sur un bouton stop.
    Si le thread s'arrête, quel est le problème ?

  11. #11
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 679
    Par défaut
    Essaie aussi de déclarer la variable actif comme private volatile boolean actif = true;

    Sinon, il est possible que pour le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (actif) {
    	System.out.println("actif");
    	attendre(1000);
    }
    le compilateur soit tenté d'optimiser en supprimant le test de la condition de la boucle, vu que la variable actif ne peux pas être modifié par le thread en court.
    En déclarant actif "volatile" tu empêches, ce type d'optimisation.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 8
    Par défaut
    merci pour la réponse mais j'ai déjà essayé le volatile ca change rien :/


    Citation Envoyé par Mobius Voir le message
    Si le thread s'arrête, quel est le problème ?
    en fait ce que je voulais dire c'est qu'il doit s'arrêter comme ca mais justement ca ne fonctionne pas d'où le problème

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Par défaut
    Ce code est appelé par une interface graphique. Un bouton A appelle la méthode "start" du thread et un bouton B appelle la méthode "arreter" qui change donc juste la variable de la classe.

    On a constaté que même si l'on modifie la variable en question, on dirait que le thread s'en cogne le coquillât et continue son affaire.

    Nous ne voulons ici pas faire appel à la méthode "stop", à la limite, un "sleep" mais nous n'en sommes pas là. Le seul hic, c'est qu'on ne comprend pas pourquoi le thread continue sa tambouille et ne s'arrête pas lorsque l'on modifie le booléen à "false".

    PS : j'ai jeté un œil à la globalité de son code et je ne comprends pas non plus pourquoi ça merdouille.

  14. #14
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Ca vient de tes instructions qui bloquent le thread : this.monde.Nextgeneration();
    this.canva.paintAll(this.canva.getGraphics());

    J'imagine que ces deux instructions prennent du temps et du coup tu ne reviens jamais effectuer le test de sortie while(actif).

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Par défaut
    Même si ça prend du temps à s'exécuter, le test doit tout de même être fait puisque le thread est toujours actif, non ? Je ne pense pas que ça prenne plus de 30 secondes à rafraîchir une interface graphique, sinon, je ne comprends pas comment tournent les IHM java :s

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Si ton this.monde.Nextgeneration(); prend beaucoup de temps, tu n'en sortiras jamais (enfin si mais dans longtemps), et donc même si la variable de sortie du thread est modifiée tu n'effectueras jamais le test de sortie.
    Tu comprends ?

  17. #17
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par Cazouille Voir le message
    Même si ça prend du temps à s'exécuter, le test doit tout de même être fait puisque le thread est toujours actif, non ? Je ne pense pas que ça prenne plus de 30 secondes à rafraîchir une interface graphique, sinon, je ne comprends pas comment tournent les IHM java :s
    J'imagine que tu fais du Swing et il faut savoir que Swing utilise son propre thread pour l'affichage. Donc il est fortement conseillé de lancer Swing dans un thread à part en faisant ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            // tu crées ton IHM ici
        }
    });

    Bah le probleme avec ton code est que tu veux arreter le thread MonThread (en faisant à mon quelque part thread.arreter()) tandis que le thread appelant n'a pas la main. Donc du coup, ca bloque.

  18. #18
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Par défaut
    En gros, pour vous, le thread de l'IHM empêche le thread implémenté de s'exécuter correctement ? (J'avoue, ça me laisse perplexe, je ne me rappelle pas avoir eu ce genre de problème)

    Java est bien censé lui-même gérer ses thread internes, non ?

    Alors si l'on crée un thread "manuellement", il est censé être prioritaire (je ne fais que supputer, j'entre sur un terrain miné car je n'ai jamais poussé le problème jusque-là ^^ donc faites-moi savoir si je dis des conneries)

  19. #19
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par Cazouille Voir le message
    En gros, pour vous, le thread de l'IHM empêche le thread implémenté de s'exécuter correctement ? (J'avoue, ça me laisse perplexe, je ne me rappelle pas avoir eu ce genre de problème)
    C'est un problème classique que l'on rencontre lorsqu'on utilise des thread dans son programme.
    Et ce n'est pas le thread de l'IHM qui est en cause mais le thread MonThread que t'a créé parce que le thread appelant (la partie du code ou tu appelles thread.arreter()) n'a pas la main et il ne peut pas s'éxécuter. Quand tu lances un programme qui contient des threads, tu n'as aucune garantie quant à l'ordre d'exécution des threads entre eux. Ce n'est pas parce que le thread A est créé avant les threads B et C qu'il s'exécutera avant eux. Une exécution possible est B, A , C ou C B A, etc

    Citation Envoyé par Cazouille Voir le message
    Java est bien censé lui-même gérer ses thread internes, non ?
    Vu les raisons que j'ai évoquées, c'est au programmeur de gérer l'exécution de ses threads.



    Citation Envoyé par Cazouille Voir le message
    Alors si l'on crée un thread "manuellement", il est censé être prioritaire (je ne fais que supputer, j'entre sur un terrain miné car je n'ai jamais poussé le problème jusque-là ^^ donc faites-moi savoir si je dis des conneries)
    Quand tu crées un thread, sa priorité est égale à celle qui l'a créé.

  20. #20
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Par défaut
    O.K. Merci pour tes éclaircissements (et aux autres aussi )
    C'est bien Swing qui est utilisé, au passage.
    Je regarderai de nouveau avec l'auteur du topic et il vous tiendra au courant.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. L'arret d'un thread par le CLR
    Par tobba dans le forum VB.NET
    Réponses: 2
    Dernier message: 12/12/2008, 20h39
  2. arret d'un thread par son id ?
    Par gregcat dans le forum Windows Forms
    Réponses: 12
    Dernier message: 15/05/2008, 23h17
  3. arret Background worker thread
    Par ricky78 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/02/2007, 12h15
  4. delphi/Oracle :FListner, arret d'un thread
    Par Lust14 dans le forum Delphi
    Réponses: 10
    Dernier message: 07/12/2006, 20h23
  5. [Thread] pb apres arret d'un thread
    Par titiyo dans le forum Langage
    Réponses: 5
    Dernier message: 20/02/2006, 10h11

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