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 :

Arretez moi mon thread :)


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut Arretez moi mon thread :)
    le voici :

    A l'intérieure des methodes Cycle() j'utilise testFin() quelques fois pour arreter mon thread quand je clic sur un bouton qui me met ma variable stopThread à true.

    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
     
    public class Histo extends Thread {
     
    	private int nb=0, nbDD=0;
    	private Date date;
    	private GetSNMP gsnmp;
    	private Poster mail;
    	private String[] elements;
    	private Elements el;
    	private PingElement pe; 
    	private String[] tabR;
    	private long idElement;
    	private Locale locale;
    	private DateFormat dateFormat;
    	private DataBas db;
    	private ResultSet rs;
    	private long temps;
    	private boolean stopThread = false;
    private boolean stopThread = false;
     
    	public Histo(String tps)
    	{
    	temps=Long.parseLong(tps);
    	this.start();
    	}
     
    public synchronized void arret() {
       stopThread = true;
    }
     
    public void run() 
    {
    	try {
    	while (true){
     
    		el = new Elements();
    		Cycle("sgsf_mon",0);	//Switch et Routeurs
    		Cycle("sgsf_mon",1);	//Serveurs et Flexnet
    		Cycle("sgsf_mon",2);	//Points acces
    		Thread.sleep(temps*1000);
    	}	
    		}catch( InterruptedException e ) {
    			System.out.println(e);
    		} 
    } 
     
    public synchronized void testFin() throws InterruptedException {
        if( stopThread ) {
        	throw new InterruptedException();
        } 
    }
    Lors d'un clic sur ce bouton , la methode tesFin() s'execute car j'obtiens dans la console : java.lang.InterruptedException. Problème le thread ne s'arrete po

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    J'aimerai ne pas utiliser une exception pour arreter le thread , mais je ne vois pas comment terminer la fonction run en appuyant sur un bouton qui mettrai une variable a true.

    Mes fonctions cycles sont super longues et je ne doit pas attendre qu'une finisse pour terminer le thread. Je voudrais que mon thread se termine a l'interieur d'une des metodes cycle.

    Merci

  3. #3
    Membre émérite Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Par défaut
    il faut pas faire un .stop ?

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Ou pas, stpo est deprecated, et à bannir de ce fait.
    Pour interrompe un Thread tu peux passer par sa méthode interrupt()

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par sozie9372
    il faut pas faire un .stop ?
    la méthode stop() est Deprecated.
    Pour plus d'infos : Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.

    [edit] grilled [/edit]
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  6. #6
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    rhaaa lalaaa .. la seule vraie méthode pour arrêter 1 Thread (on vous l'a dit et répété) c'est d'arriver à l fin de la méthode run

    quand je clic sur un bouton qui me met ma variable stopThread à true
    Cette variable devrait se trouver dans ton Thread, et ta méthode run devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public void run() 
    {
    	while (!stopThread){
     
    		el = new Elements();
    		Cycle("sgsf_mon",0);	//Switch et Routeurs
    		Cycle("sgsf_mon",1);	//Serveurs et Flexnet
    		Cycle("sgsf_mon",2);	//Points acces
    		Thread.sleep(temps*1000);
    	}	
    }

  7. #7
    Membre émérite Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Par défaut
    désolé...
    En même temps je n'ai jamais eu à l'utiliser car je suis plutôt adepte de la méthode de NeptuS

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    Je ne voudrais pas attendre qu'il finisse un while complet avant de s'arreter .
    Chaque Cycle et une opération longues que je voudrais stopper à tous moments

  9. #9
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    t'as la solution du break, mais c'est crade.

  10. #10
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    à priori, je dirai que ton programme est trop pensé linéairement ... et pas assez d'un point de vue évènementiel :
    A l'intérieure des methodes Cycle() j'utilise testFin() quelques fois pour arreter mon thread quand je clic sur un bouton qui me met ma variable stopThread à true.
    Cette structure est trop lourde et te fait perdre une boucle entière avant que le Thread ne se termine.

    il y a 2 ou 3 choses que je ne saisis pas dans ton programme, comme la raison pour laquelle tu recréée un "Elements" à chaque début de boucle car il n'est -- a priori, pas modifié.

    Si "Cycle" est une méthode, elle devrait commencer par une minuscule.
    tu peux très bien remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void run() 
    {
    	while (!stopThread){	
    		el = new Elements();
    		Cycle("sgsf_mon",0);	//Switch et Routeurs
    		Cycle("sgsf_mon",1);	//Serveurs et Flexnet
    		Cycle("sgsf_mon",2);	//Points acces
    		Thread.sleep(temps*1000);
    	}	
    }
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void run() 
    {
    	while (!stopThread){
    		el = new Elements();
    		for(int i=0 ; i<3 ; i++)
    		     if(!stopThread) Cycle("sgsf_mon", i);
    		Thread.sleep(temps*1000);
    	}	
    }
    Ensuite, si tu veux stopper le chargement du cycle au milieu, tu modifie ta fonction "Cycle" en faisant des blocs insécables (des blocs logiques de if(!stopThread){ ....} )

  11. #11
    Membre chevronné
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Par défaut
    Citation Envoyé par NeptuS
    à priori, je dirai que ton programme est trop pensé linéairement ... et pas assez d'un point de vue évènementiel :

    Cette structure est trop lourde et te fait perdre une boucle entière avant que le Thread ne se termine.

    il y a 2 ou 3 choses que je ne saisis pas dans ton programme, comme la raison pour laquelle tu recréée un "Elements" à chaque début de boucle car il n'est -- a priori, pas modifié.

    Si "Cycle" est une méthode, elle devrait commencer par une minuscule.
    tu peux très bien remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void run() 
    {
    	while (!stopThread){	
    		el = new Elements();
    		Cycle("sgsf_mon",0);	//Switch et Routeurs
    		Cycle("sgsf_mon",1);	//Serveurs et Flexnet
    		Cycle("sgsf_mon",2);	//Points acces
    		Thread.sleep(temps*1000);
    	}	
    }
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void run() 
    {
    	while (!stopThread){
    		el = new Elements();
    		for(int i=0 ; i<3 ; i++)
    		     if(!stopThread) Cycle("sgsf_mon", i);
    		Thread.sleep(temps*1000);
    	}	
    }
    Ensuite, si tu veux stopper le chargement du cycle au milieu, tu modifie ta fonction "Cycle" en faisant des blocs insécables (des blocs logiques de if(!stopThread){ ....} )
    C'est beau, quand même, l'optimisation de code source...non ?
    Moi en tout cas j'aime bien !
    Ca permet de voir une autre façon de coder, de la part d'un collègue qui est totalement détaché du projet, ce qui lui permet d'analyser d'un plus haut niveau même un ridicule petit bout de code.

    Ca encourage à développer en binome ça !
    Vivement que je connaisse une exeprience en eXtreme Programming !!

  12. #12
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par NeptuS
    Cette structure est trop lourde et te fait perdre une boucle entière avant que le Thread ne se termine.
    Pas forcément : si la vérification de l'état du thread est effectué à l'intérieur de la méthode Cycle() (c'est pas beau un nom de méthode avec une majuscule) et que cette dernière renvoit une InterruptedException, on sort directement de la boucle...

    Maintenant si tu dis que le texte du catch() est affiché dans la console le thread devrait s'arrêter puisque tu arrives à la fin de la boucle... à moins qu'il ne s'agissent d'un autre catch()...

    a++

  13. #13
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    adiGuba, si c'est une erreur qui fait s'arrêter le programme, je suis d'accord pour que ça lance une exception.
    En revanche, si c'est une condition normale de sortie de Thread, je ne vois pas la "propreté" de lancer une Exception : un simple boolean est acceptable.

    Regis.C :
    ce qui lui permet d'analyser d'un plus haut niveau même un ridicule petit bout de code
    Le "ridicule petit bout de code" qui a été changé a permis de répondre à une partie de la question posée, qui était :

    Je ne voudrais pas attendre qu'il finisse un while complet avant de s'arreter
    et le ' if ' inséré permettait de répondre à cette question.
    La boucle n'est qu'une simple fioriture qui permet de ne pas réécrire 3 fois les 2 mêmes lignes.

    Et personnellement, le codage en binome, j'ai testé et ça ne donne que de la m**** : la seule solution pour coder à plusieurs, c'est une analyse sans faille et coder (si possible) des packages différents.

  14. #14
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par NeptuS
    adiGuba, si c'est une erreur qui fait s'arrêter le programme, je suis d'accord pour que ça lance une exception.
    En revanche, si c'est une condition normale de sortie de Thread, je ne vois pas la "propreté" de lancer une Exception : un simple boolean est acceptable.
    Un simple booléen peut faire l'affaire, je n'ai pas dit le contraire...

    Toutefois l'utilisation d'une exception peut s'avérer utile dans certain cas, car cela permet de stopper le thread au milieu d'une méthode. On ne connait pas la méthode Cycle() et cette dernière peut être plus ou moins longue. Il peut être souhaitable de stopper le thread avant la fin du traitement complet de cette méthode. Dans ce cas une InterruptedException est approprié, puisque elle indique que la méthode ne s'est pas terminé correctement...

    De plus on peut éviter de s'embêter à coder des méthodes pour arrêter le thread et vérifier l'état du booléen : on peut directement utiliser interrupt() et isInterrupted().

    Enfin interrupted() permet de sortir de certaines méthodes bloquantes (sleep(), wait(), read()/write() avec les InterruptibleChannel, etc.) en renvoyant une exception...

    a++

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

Discussions similaires

  1. Besoin d'avis sur mon thread
    Par SanNash dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 20/06/2006, 11h44
  2. Réponses: 6
    Dernier message: 11/05/2006, 16h00
  3. Réponses: 1
    Dernier message: 16/01/2006, 10h15
  4. j'arrive pas a arreter mon thread d'arriere-plan
    Par ms91fr dans le forum Langage
    Réponses: 6
    Dernier message: 06/06/2003, 21h36

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