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 :

Comment arrêter mon Thread ?


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 52
    Points : 31
    Points
    31
    Par défaut Comment arrêter mon Thread ?
    Bonjour à tous,

    J'ai besoin de votre aide, via une commande que l'on m'envoie (socket) je dois démarrer un mode de démonstration de mon programme.
    J'ai créé une classe Demo que je démarre via la méthode Start(); cela fonctionne bien.
    Le soucis que j'ai maintenant c'est que je ne sais pas comment arrêter le Thread en cours.
    C'est un programme que je reprends et je débute un peu en Java, quelqu'un pourrait-il me donner un coup de main ?

    Voici le code :

    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
    public class Demo{
    	Timer t;
    	private static Demo MyDemo = null; // Singleton
     
    	/**
             * Constructor
             */
    	private Demo(){
    	}
     
    	/**
             * Return the Singleton of Demo
             * @return Demo
             */
    	public static Demo getInstance(){
    	 	if(MyDemo==null)
    	 	MyDemo = new Demo();
    	 	return MyDemo;
    	 }
     
    	/**
             * To stop the demo mode
             */
    	protected void Stop() {
    		System.out.println("Arret du mode demo");
    		t.cancel();
    		t=null;
    		//t = new Timer();
    		//t.schedule(new MonAction(), 99999, 10000);
    	 }
     
    	/**
             * To start the demo mode
             */
    	protected void Start() {
    		System.out.println("Demarrage du mode demo");
    		t = new Timer();
    		t.schedule(new MonAction(), 1, 10000);
    	}
     
    /**
     * Timer for the demo mode
     */
    class MonAction extends TimerTask {
    	public void run() {
     
    		// Mon code qui doit tourner en boucle et qui doit s'arrêt lorsque
    	}
    }
    }

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /**
     * Timer for the demo mode
     */
    class MonAction extends TimerTask {
            private volatile finished = false;
            public void stop(){finished=true;}
    	public void run() {
     
    		while(!finished) {
                            //on boucle
                    }
    	}
    }
    }
    Par contre, vu que tu tourne en boucle dans run, ce n'est pas un timer task et un timer qu'il te faut, c'est un Thread. Les timer, c'est pour les opération répétitive, une boucle continue, c'est une seule action continue.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 52
    Points : 31
    Points
    31
    Par défaut
    Merci tchize_ pour ta réponse
    Je dois créer un thread avec un boucle infinie c'est ça ?
    Ce que je ne vois pas comment faire c'est pour arrêter ce thread lorsqu'il est en cours d’exécution.
    Merci en tout cas pour ton aide.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    La boucle n'est pas infinie, elle s'arrête quand finished passe à true.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 52
    Points : 31
    Points
    31
    Par défaut
    Je suis désolé de t'embêter avec ça tchize_ ça semble surement évidemment pour toi mais je ne comprends pas trop.
    Aurais-tu un exemple ?

    Je vais regarder sur internet en parallèle, il me faut une solution pour demain matin

    Edit : en fait je souhaite que le code contenu dans mon thread tourne en boucle et ne s'arrête complètement que lorsque je reçois une commande.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    L'exemple que je t'ai donné avant ne te suffit pas ? Il suffit d'appeler cEstFini() pour arrêter ton 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
    /**
     * Timer for the demo mode
     */
    class MonAction extends Thread{
            private volatile finished = false;
            public void cEstFini(){finished=true;}
    	public void run() {
     
    		while(!finished) {
                            //ton code
                    }
    	}
    }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MonAction action = new MonAction();
    action.start();
    //.....
    action.cEstFini();

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 52
    Points : 31
    Points
    31
    Par défaut
    Ah oui en effet... j'ai besoin de sommeil moi
    Merci je vais regarder ça

  8. #8
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 52
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    J'obtiens l'erreur suivante lorsque j'essaye de compiler :

    <identifier> expected
    private volatile finished = false;

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ouais j'ai oublié de mettre le type de la variable, tu as surement deviné que c'est boolean. J'ai tappé le code à la vavite dans le forum, tu as l'idée générale comme ça. Après, à toi d'écrire le code ^^

  10. #10
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Je ne sais pas si c'est nécessaire de s'embêter avec un attribut finished en mode volatile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class MonAction extends Thread{
        public void run() {
            while(!Thread.interrupted()) {
                //ton code
            }
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MonAction action = new MonAction();
    action.start();
    //.....
    action.interrupt();

    Bonne soirée,
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    interrupt sert juste à interrompre certaines opérations bloquantes, mais nécessairement à arrêter le thread. Il est toujours préférable d'utiliser son propre flag qui lui n'est pas pollué par les codes tiers. Et si on a des opération bloquantes, alors on combine les deux. C'est ce que recommande oracle:


    Many uses of stop should be replaced by code that simply modifies some variable to indicate that the target thread should stop running. The target thread should check this variable regularly, and return from its run method in an orderly fashion if the variable indicates that it is to stop running. If the target thread waits for long periods (on a condition variable, for example), the interrupt method should be used to interrupt the wait.

Discussions similaires

  1. Comment arrêter un Thread proprement
    Par takinelinfo dans le forum C#
    Réponses: 9
    Dernier message: 08/01/2018, 08h42
  2. Où est comment placer mon Thread?
    Par Micke7 dans le forum Général Java
    Réponses: 3
    Dernier message: 13/04/2010, 12h25
  3. Comment arréter un thread qui exécute une instruction bloquante
    Par nibor2luxe dans le forum Concurrence et multi-thread
    Réponses: 15
    Dernier message: 28/02/2008, 17h03
  4. Réponses: 6
    Dernier message: 11/05/2006, 16h00
  5. Réponses: 18
    Dernier message: 06/04/2005, 14h09

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