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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    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
    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
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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
    Membre habitué
    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
    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 : 52
    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
    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/
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

  5. #5
    Membre habitué
    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
    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 Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    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 ?

Discussions similaires

  1. relancer un Thread une fois mort ?
    Par altahir007 dans le forum VB.NET
    Réponses: 4
    Dernier message: 01/01/2013, 17h06
  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 démarrer mon projet
    Par shuriok dans le forum C++
    Réponses: 6
    Dernier message: 04/06/2008, 14h20
  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, 16h47
  5. Réponses: 6
    Dernier message: 11/05/2006, 16h00

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