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 :

Comment démarrer mon Thread une fois mort ?


Sujet :

Concurrence et multi-thread Java

  1. #1
    Candidat au Club
    Femme Profil pro
    Analyse système
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 3
    Points
    3
    Par défaut Comment démarrer mon Thread une fois mort ?
    Bonjour,

    je lance mon thread comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void run()
    {
         while (true){
             traitement();
         }
    }
    Est-ce que le fait de catcher une exception dans la méthode de run() me permet de redémarrer mon thread une fois qu'il est mort ?

    Merci de votre aide.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    un thread ne démarre qu'une fois, et ca n'a absolument rien à voir avec les exceptions. Si tu ne veux pas que le thread s'arrête, ne sort pas de la méthode run()

  3. #3
    Candidat au Club
    Femme Profil pro
    Analyse système
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    un thread ne démarre qu'une fois, et ca n'a absolument rien à voir avec les exceptions. Si tu ne veux pas que le thread s'arrête, ne sort pas de la méthode run()
    Merci de votre réponse.

    En fait, dans mon programme, une exception se produit dans la méthode "traitement" appelée à partir de la méthode de run();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void run()
    {
    while (true){
    traitement}
    }
    }
    Donc la requête appelée dans la méthode de traitement n'est pas exécutée, est-ce que le thread est mort à ce moment ?

    Et moi je veux que cette requête s'exécute tout le temps.
    Comment faire?
    merci

  4. #4
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Points : 17 037
    Points
    17 037
    Par défaut
    Bonjour,

    Tant que l'exécution ne sort pas de la méthode run(), ton Thread est toujours actif.
    Cf. http://alwin.developpez.com/tutorial/JavaThread/

  5. #5
    Candidat au Club
    Femme Profil pro
    Analyse système
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Laurent.B Voir le message
    Bonjour,

    Tant que l'exécution ne sort pas de la méthode run(), ton Thread est toujours actif.
    Cf. http://alwin.developpez.com/tutorial/JavaThread/
    Merci de votre réponse.

    En fait, voici le log :
    java.lang.NullPointerException
    at oracle.jdbc.driver.OracleStatement.clearDefine(OracleStatement.java:1335)
    at oracle.jdbc.driver.OracleStatement.end_of_result_set(OracleStatement.java:2998)
    at oracle.jdbc.driver.OracleResultSetImpl.internal_close(OracleResultSetImpl.java:688)
    at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:231)
    at monpakage.maClasse.traitement(Unknown Source)
    at monpakage.maClasse.run(Unknown Source)
    at monpakage.maClasse.Emploi(Unknown Source)
    Voici le code de démarrage de mon 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
    15
    16
    17
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import Emploi;
     
    public class LoadServletsaga extends HttpServlet {
     
        public void init() throws ServletException {
     
            try {
                Emploi  threadEmploi = new Emploi();
                threadEmploi.start();
            } catch (Throwable ex) {
                System.err.println("Initial SessionFactory creation failed." + ex);
                throw new ExceptionInInitializerError(ex);
            }
        }
    }
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    public class Emploi extends Thread {
     
        private int limit=10;
        int i=0;
     
        private String SQL ="select ID  from emploi where flag is null";
     
        private static int nbThreads = 0;
     
        public Emploi () {
            nbThreads++;
        }
        public void run() {
            while (true) {
                this.traitement();
            }
        }
     
        private String traitement() {
     
                try {
                    resultSet = this.queryDB(this.SQL);
                }
                catch (Exception ex1) {
                    log.error("Open Resultset exception dans conection" + ex1.getMessage() +  "/" + ex1.getCause());
                    goSleep();
                    ConnectionFactory.resetConnection();
                    return traitement();
                }    
     
                try {
                    if ( (resultSet == null) || (!resultSet.next())) {
                        goSleep();
                        return "";
                    }
     
                    id = resultSet.getString(1);
     
                    if ( (id == null))  {
                        goSleep();
                        return "";
                    }
                } 
                catch (SQLException e) {
     
                    log.error("Exception ");
                    goSleep();                
                    return traitement();
                }
     
                // methode comme paramerre "id"
                getMethode(id);
     
                // set counter to sleep 
                i=0;
     
            return resultFull;
        }
     
        private ResultSet queryDB(String sRequete) {
            ConnectionFactory factory=null;
            try {
                 factory = new ConnectionFactory();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
     
            ResultSet rsQuery = null;
                log.debug("Request: " + sRequete);
                rsQuery = factory.queryDB(sRequete);
     
            return rsQuery;
        }
     
        public void goSleep(){
     
            try {
                if (i==0) {
                    log.info("sleeping ... ");
                    i++;
                }
     
                Thread.sleep(10000);
            } 
            catch (Exception ex1) {
                log.error("Exception thread: " + ex1.getMessage() +  "/" + ex1.getCause());
            }
        }
    }
    D’après les logs, quelle peut être l'origine du problème et comment puis-je le résoudre ?

    Merci d'avance.

  6. #6
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Où est déclaré ton resultSet ? Là il ne l'est nulle part. Et son scope semble trop important par rapport au 1er try / catch de la méthode traitement : s'il y a eu un gros problème sur la récupération du resultSet, pas la peine d'essayer de faire des choses dessus ensuite.

    Il y a une erreur loggée auparavant ?

  7. #7
    Candidat au Club
    Femme Profil pro
    Analyse système
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Où est déclaré ton resultSet ? Là il ne l'est nulle part. Et son scope semble trop important par rapport au 1er try / catch de la méthode traitement : s'il y a eu un gros problème sur la récupération du resultSet, pas la peine d'essayer de faire des choses dessus ensuite.

    Il y a une erreur loggée auparavant ?

    merci de votre réponse.

    en fait, j'ai oublié de mentionner que resultSet ; est initialiser au debut de classe comme suit :
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    public class Emploi extends Thread {
     
        private int limit=10;
        int i=0;
        	ResultSet resultSet = null ; 
        private String SQL ="select ID  from emploi where flag is null";
     
        private static int nbThreads = 0;
     
        public Emploi () {
            nbThreads++;
        }
        public void run() {
            while (true) {
                this.traitement();
            }
        }
     
        private String traitement() {
     
                try {
                    resultSet = this.queryDB(this.SQL);
                }
                catch (Exception ex1) {
                    log.error("Open Resultset exception dans conection" + ex1.getMessage() +  "/" + ex1.getCause());
                    goSleep();
                    ConnectionFactory.resetConnection();
                    return traitement();
                }    
     
                try {
                    if ( (resultSet == null) || (!resultSet.next())) {
                        goSleep();
                        return "";
                    }
     
                    id = resultSet.getString(1);
     
                    if ( (id == null))  {
                        goSleep();
                        return "";
                    }
                } 
                catch (SQLException e) {
     
                    log.error("Exception ");
                    goSleep();                
                    return traitement();
                }
     
                // methode comme paramerre "id"
                getMethode(id);
     
                // set counter to sleep 
                i=0;
     
            return resultFull;
        }
     
        private ResultSet queryDB(String sRequete) {
            ConnectionFactory factory=null;
            try {
                 factory = new ConnectionFactory();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
     
            ResultSet rsQuery = null;
                log.debug("Request: " + sRequete);
                rsQuery = factory.queryDB(sRequete);
     
            return rsQuery;
        }
     
        public void goSleep(){
     
            try {
                if (i==0) {
                    log.info("sleeping ... ");
                    i++;
                }
     
                Thread.sleep(10000);
            } 
            catch (Exception ex1) {
                log.error("Exception thread: " + ex1.getMessage() +  "/" + ex1.getCause());
            }
        }
    }

    merci

  8. #8
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut


    Il n'y a aucune raison à déclarer resultSet comme membre de classe, ça ne peut que générer des problèmes !
    Ôte donc déjà cette déclaration au niveau de la classe, et rajoute le dans la méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private String traitement() {
        ResultSet resultSet = null; 
                try {
                    resultSet = this.queryDB(this.SQL);
                }
    // ...

  9. #9
    Candidat au Club
    Femme Profil pro
    Analyse système
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message


    Il n'y a aucune raison à déclarer resultSet comme membre de classe, ça ne peut que générer des problèmes !
    Ôte donc déjà cette déclaration au niveau de la classe, et rajoute le dans la méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private String traitement() {
        ResultSet resultSet = null; 
                try {
                    resultSet = this.queryDB(this.SQL);
                }
    // ...


    en fait, j'ai fait la modification ResultSet resultSet = null; dans la methode traitement, mais j'ai tjs le même le probleme d'arrêt de thread.

    message erreur suivant :
    ***********exception dans traitement**********

    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
    public void run() {
            while (true) {
    try {
                this.traitement();
    }
    catch (Exception ex) {
    log.debug("***********exception dans traitement**********");
    goSleep();}
     
    	}
            }
        }

    est ce que l'exception est produite dans run() ou bien la méthode de traitement?


    merci

  10. #10
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    L'exception est produite dans ta méthode de traitement, n'y est pas catchée, et donc se propage dans ta méthode run, où elle est interceptée de manière inefficace, ie sans qu'on puisse savoir ce qui pose problème. Au minimum le catch doit inclure le log du message de l'exception, et il est plus efficace de faire un e.printStackTrace si tu veux vraiment savoir ce qui pose problème.

  11. #11
    Candidat au Club
    Femme Profil pro
    Analyse système
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    L'exception est produite dans ta méthode de traitement, n'y est pas catchée, et donc se propage dans ta méthode run, où elle est interceptée de manière inefficace, ie sans qu'on puisse savoir ce qui pose problème. Au minimum le catch doit inclure le log du message de l'exception, et il est plus efficace de faire un e.printStackTrace si tu veux vraiment savoir ce qui pose problème.


    bonjour,

    merci de votre réponse.

    L’exception dans la méthode traitement est à cause de la fermeture de connexion.

    En fait, dans la méthode traitement, j'appelle la méthode queryDB suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public ResultSet queryDB(String requete) {
            ResultSet rsQuery = null;
            private static Statement sta = null;
            try {
               log.debug("Request: " + requete);
                rsQuery = sta.executeQuery(requete);
            } catch (SQLException ex) {
                log.error("Error Request : " + ex.getCause() + " / "
                        + ex.getMessage());
     
            }
            return rsQuery;
        }


    ma question comment je peux stopper la propagation de l'exception qui se produit dans la méthode traitement vers la méthode run()??


    en plus, même j’appelle la méthode goSleep() pour dormir le thread ; il n’a aucun effet .

    Merci d’avance.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    via un catch, comme tout exception :/

  13. #13
    Candidat au Club
    Femme Profil pro
    Analyse système
    Inscrit en
    Juillet 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    via un catch, comme tout exception :/
    Bonjour,

    en fait, j'ai changé le code comme suit :

    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
    private ResultSet queryDB(String sRequete) throws SQLException  {
    		ConnectionFactory factory=null;
    		ResultSet rsQuery = null;
    		try {
    			log.debug("Request: " + sRequete);
    			maconnection= new Connection();
    			rsQuery = maconnection.queryDB(sRequete);
    			}
    			catch (SQLException e)
    			{
    				try
    			    {
     
    			        Thread.sleep (30000);
    			    }
    			    catch (InterruptedException exception){
    			    	log.error("Exception sleep thread : "); 
    			    	e.printStackTrace();
    			    }	
    			}
     
    		return rsQuery;
    	}

    par contre, le thread mort avec exception suivante :

    java.lang.NullPointerException
    at oracle.jdbc.driver.OracleResultSetImpl.internal_close(OracleResultSetImpl.java:688)
    at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:231)
    at monpakage.maClasse.traitement(Unknown Source)
    at monpakage.maClasse.run(Unknown Source)
    at monpakage.maClasse.Emploi(Unknown Source)



    ma question :
    pourquoi l'exception est monté jusqu’à la méthode run() sachant que j'ai intercepté l'exception dans la méthode de queryDB.

    merci d'avance.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    il n'y a pas de catch NullPointerException dans votre methode query. De toutes facons, c'est une mauvaise idée de les attraper, ces exceptions dénottent en général un bug dans le logiciel. Controlez vos variable pour éviter ça

Discussions similaires

  1. relancer un Thread une fois mort ?
    Par altahir007 dans le forum VB.NET
    Réponses: 4
    Dernier message: 01/01/2013, 18h06
  2. Où est comment placer mon Thread?
    Par Micke7 dans le forum Général Java
    Réponses: 3
    Dernier message: 13/04/2010, 13h25
  3. Comment démarrer mon projet
    Par shuriok dans le forum C++
    Réponses: 6
    Dernier message: 04/06/2008, 15h20
  4. Comment démarrer mon pc sur le Cd-rom
    Par savoir dans le forum Windows XP
    Réponses: 10
    Dernier message: 30/12/2007, 17h47
  5. Réponses: 6
    Dernier message: 11/05/2006, 17h00

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