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] Lancer un thread puis l'arrêter


Sujet :

Concurrence et multi-thread Java

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut [Thread] Lancer un thread puis l'arrêter
    Bonjour

    Un petit problème me vient. J'ai réécrit l'algorithme de spring Layout pour mes graphes. Or, je voudrais lancer cet algo via un thread. L'idée est la suivante, dans mon UI, j.ai un JMenuItem qui a la call-back suivante :
    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
     
    private void beginSpringLayout(ActionEvent evt)
     
    	{
     
    		thread = new Thread(){
     
    			public void run() {
     
    				SpringLayout.advancePositions();
     
    			}
     
    		};
     
    		thread.start();
     
    	}
    Puis, j'ai un autre JMenuItem qui permet d'arrêter le thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    private void endSpringLayout(ActionEvent evt)
     
    	{
     
    		thread = null;
     
    	}
    Mais, quand j'exécute mon code et active le thread, j'ai l'impression que celui-ci s'exécute pendant 1s puis s'arrête.
    Est-ce que cela vient du code que je viens de vous montrer ? Si non, c'est que ça vient d'une mauvaise implémentation de mon algo. Petite indication, je n'ai aucune erreur à la compilation comme à l'exécution.
    Merci d'avance de vos réponses.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  2. #2
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Il faut faire une méthode run du genre (il faut boucler sinon le thread s'arrête):

    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
    private boolean stop = false;
    ...
    public void run() {
     
      boolean fin = false;
      while (!fin) {
     
        // Traitements
        ...
        synchronized(this) {
          Thread.yield();
          fin = stop;
        } 
     
        try {
          sleep(1000);
        }
        catch (InterruptedException e) {
          // ...
        }
      }
    }
     
    public synchronized void stopThread() {
      this.stop = true;
    }


    Sinon pour arrêter le thread il faut uiliser un pipe pour positione le booléen fin à false.
    Le fait de mettre la référence du thread à null ne va pas suffir à le faire de terminer je pense.

  3. #3
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Bonsoir Thibaut

    Merci de ta réponse. Voici comment je l'ai implémenté :
    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
     
    private void beginSpringLayout(ActionEvent evt)
    	{
    		final boolean stop = false;
    		thread = new Thread(){
    			public void run() {
    				boolean fin = false;
    				while (!fin) {
    					SpringLayout.advancePositions();
    				    synchronized(this) {
    				    	Thread.yield();
    				    	fin = stop;
    				    }
    				    try {
    				      sleep(500);
    				    }
    				    catch (InterruptedException e) {}
    				}
    			}
    		};
    		thread.start();
    	}
     
    	private void endSpringLayout(ActionEvent evt)
    	{
    		thread = null;
    	}
    Seulement, le thread ne veut pas se terminer !
    Comment l'arrêter ?
    Merci d'avance.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 116
    Points : 128
    Points
    128
    Par défaut
    C'est normal vu que tu met ton fin=stop lors de l'init si tu change stop, il ne change pas fin. Il faut faire soit un thread.fin=true; soit ecrire une methode arrete(){ fin=true;} dans ton thread; et la la boucle elle se terminera tous seul. C'est un peu la base du thread. Tu devrais consulter les docs dessus.

  5. #5
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Citation Envoyé par GLDavid
    Seulement, le thread ne veut pas se terminer !
    Comment l'arrêter ?
    Merci d'avance.

    @++
    Pour l'arrêter tu as plusieurs solutions:

    Si tu es dans la même JVM:
    - tu uilises les classes PipedReader et PipedWriter. Ton thread à une référence sur un PipedReader et tu récupères dans l'autre classe la référence à ce reader et tu y connecte y PipedWriter. Tu envoies un ordre (celui que tu veux). Après il te suffit dans ton thread de lire sur le flux entrant (reader) et de mettre le booléen à false.

    - tu appelle la méthode stopThread quand tu juges que le travail est finit (un temps définit par exmple)

    Si tu es dans deux JVM tu utilises un socket et un serveur socket (je l'ai fait ça marche et c'est trop cool), ou une connection RMI par exemple.

    A+

  6. #6
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Okay, j'essaierais d'implémenter vos solutions demain.
    Merci à vous pour vos réponses et passez une bonne soirée.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  7. #7
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Bon, j'ai résolu mon problème sinon je n'en aurais pas dormi
    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
     
    private void beginSpringLayout(ActionEvent evt)
     
    	{
     
    		thread = new Thread(){
     
    			public void run() {
     
    				boolean fin = false;
     
    				while (!fin) {
     
    					SpringLayout.advancePositions();
     
    				    synchronized(this) {
     
    				    	Thread.yield();
     
    				    	fin = Namek.stop;
     
    				    }
     
     
     
    				    try {
     
    				      sleep(500);
     
    				    }
     
    				    catch (InterruptedException e) {}
     
    				}
     
    			}
     
    		};
     
    		thread.start();
     
    	}
     
     
     
    	private void endSpringLayout(ActionEvent evt)
     
    	{
     
    		Namek.stop=true;
     
    	}
     
    private static boolean stop = false;
    Merci encore à vous de vos indications !
    A charge de revanche sur du Perl.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

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

Discussions similaires

  1. [Thread] Lancer un thread et executer une tache
    Par jeanjean6 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 27/05/2010, 14h53
  2. lancer un thread dans un thread
    Par andromeda dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 27/07/2007, 23h29
  3. Lancer 2 thread consecutif.
    Par lil_k123 dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 18/04/2007, 12h38
  4. [VC++] Comment lancer un Thread
    Par ksoft dans le forum MFC
    Réponses: 5
    Dernier message: 30/05/2006, 14h19
  5. [Thread]Lancer mon programme toutes les 60 secondes?
    Par danje dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 24/11/2005, 21h55

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