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 :

Les Threads en java


Sujet :

Java

  1. #1
    Débutant
    Inscrit en
    Avril 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 360
    Points : 132
    Points
    132
    Par défaut Les Threads en java
    Salut,
    j'ai creé une fonction java dans laquelle ne redifine la methode run() de mon thread voila 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
        private int get_NbreJourOuvrable(){
               // Date date_Ouv = (Date)Date.fromText(dat_Debut, "dd/mm/yyyy", "");
               // Date date_Fin = (Date)Date.fromText(dat_Fin, "dd/mm/yyyy", "");
             //   int count = 0;
                new Thread(new Runnable(){
                    public void run(){
                        Date date_Ouv = (Date)Date.fromText("01/01/2002", "dd/mm/yyyy", "");
                        Date date_Fin = (Date)Date.fromText("18/02/2009", "dd/mm/yyyy", "");                    
                        if (date_Ouv.compareTo(date_Fin) > 0) {
                            count = -1;            
                        }
                        while (date_Ouv.compareTo(date_Fin) <= 0) {
                            if (!mDBaccess.EstJourFerie(date_Ouv) && !mDBaccess.EstJourWeekEnd(date_Ouv)) {
                                    count++; 
                                    date_Ouv = mDBaccess.AjouterJoursADate(date_Ouv, 1);                        
                            } else  date_Ouv = mDBaccess.JourOuvrableApres(date_Ouv);               
                        }
                    }}
                ).start();
                System.out.println(" count :" + count);
                return count;
        }
    mais le probleme c'est que toujours la valeur de retour vaut 0, count var globale et sachant que sans utilisé les threads la fonction retourne une valeur superieure a zero. il me semble que le thread ne s'execute pas.
    merci pour votre aide.???

  2. #2
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Salut,

    Si, le thread s'exécute probablement, mais tu n'as pas bien compris l'utilisation des thread.
    Un trhead s'exécute en parallèle d'un autre (ou plusieurs) thread.
    Ta méthode get_NbreJourOuvrable() s'exécute elle-même dans un thread (soit que tu as toi même programmé, soit dans le thread courant car un programme Java s'exécute toujours dans un thread). Après start(), le programme continu. Ainsi tu affiche la valeur de ton count (System.out.println) puis retourne la valeur de ton count, alors que le thread ne s'est probablement (ce n'est pas prévisible, mais dans ce cas ce sera le comportement le plus probable) pas encore exécuté (-> retourne 0).
    Ce n'est pas un problème de ton thread, mais un problème de conception. Tu ne peux pas faire les choses ainsi.

    Mais pourquoi faire un thread dans ce cas ?
    Je t'invite à te documenter plus profondément sur les thread.

  3. #3
    Débutant
    Inscrit en
    Avril 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 360
    Points : 132
    Points
    132
    Par défaut
    ok, je vais tres bien consulter la doc des threads, mais la solution d'apres vous, par ce que cette fonction prend bcp de temps dans son execution!!
    ok merci.

  4. #4
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    Print dans la methode run de 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    private int get_NbreJourOuvrable(){
               // Date date_Ouv = (Date)Date.fromText(dat_Debut, "dd/mm/yyyy", "");
               // Date date_Fin = (Date)Date.fromText(dat_Fin, "dd/mm/yyyy", "");
             //   int count = 0;
                new Thread(new Runnable(){
                    public void run(){
                        Date date_Ouv = (Date)Date.fromText("01/01/2002", "dd/mm/yyyy", "");
                        Date date_Fin = (Date)Date.fromText("18/02/2009", "dd/mm/yyyy", "");                    
                        if (date_Ouv.compareTo(date_Fin) > 0) {
                            count = -1;            
                        }
                        while (date_Ouv.compareTo(date_Fin) <= 0) {
                            if (!mDBaccess.EstJourFerie(date_Ouv) && !mDBaccess.EstJourWeekEnd(date_Ouv)) {
                                    count++; 
                                    date_Ouv = mDBaccess.AjouterJoursADate(date_Ouv, 1);                        
                            } else  date_Ouv = mDBaccess.JourOuvrableApres(date_Ouv);               
                        }
    System.out.println(" count :" + count);
    
                    }
    
    }
                ).start();
                
                return count;
        }

  5. #5
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Changer le print pour le mettre dans le thread permet d'afficher les bonnes valeur en console mais ne règle pas le return.

    La solution est difficile à te donner, parce qu'il faut la concevoir en fonction de ton projet.
    Que fait cette méthode, a quoi sert-elle dans ton programme, quelle est son interaction avec ton interface graphique ?

    Pour exemple : si c'est pour afficher un nombre de jours dans un JLabel, supprime alors le return count;, puis ajoute un monLabel.setText("" + count); (en l'exécutant dans l'EDT, c'est mieux) dans ton thread, à la fin.

    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
        private void miseAJourLabel(){
               // Date date_Ouv = (Date)Date.fromText(dat_Debut, "dd/mm/yyyy", "");
               // Date date_Fin = (Date)Date.fromText(dat_Fin, "dd/mm/yyyy", "");
             //   int count = 0;
                new Thread(new Runnable(){
                    public void run(){
                        Date date_Ouv = (Date)Date.fromText("01/01/2002", "dd/mm/yyyy", "");
                        Date date_Fin = (Date)Date.fromText("18/02/2009", "dd/mm/yyyy", "");                    
                        if (date_Ouv.compareTo(date_Fin) > 0) {
                            count = -1;            
                        }
                        while (date_Ouv.compareTo(date_Fin) <= 0) {
                            if (!mDBaccess.EstJourFerie(date_Ouv) && !mDBaccess.EstJourWeekEnd(date_Ouv)) {
                                    count++; 
                                    date_Ouv = mDBaccess.AjouterJoursADate(date_Ouv, 1);                        
                            } else  date_Ouv = mDBaccess.JourOuvrableApres(date_Ouv);               
                        }
                        monLabel.setText("" + count);
                    }}
                ).start();
        }

  6. #6
    Débutant
    Inscrit en
    Avril 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 360
    Points : 132
    Points
    132
    Par défaut
    Salut, la fonction sert a retourner le nombre de jour ouvrable (la profondeur d'un historique) c'est pas juste pour afficher mais c'est plutot pour plusieurs utilisation :
    Merci, l'affichage si juste pour voir, j'ai supprimer le print...
    la valeur de retour est importante, la fonction dure plus de 5 secondes
    l'interface est grisée durant les traitements..
    j'ai deja des problemes comme celui la et c'est resolu avec les threads de cette façon, mais pour ce cas il ne marche plus...

  7. #7
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    D'un point de vue généraliste, je te conseille d'avoir une méthode qui retourne ton count sans thread.
    Et tu utilise un thread aux différents endroits de ton prog qui appel cette méthode.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        public int get_NbreJourOuvrable(){
                        Date date_Ouv = (Date)Date.fromText("01/01/2002", "dd/mm/yyyy", "");
                        Date date_Fin = (Date)Date.fromText("18/02/2009", "dd/mm/yyyy", "");                    
                        if (date_Ouv.compareTo(date_Fin) > 0) {
                            count = -1;            
                        }
                        while (date_Ouv.compareTo(date_Fin) <= 0) {
                            if (!mDBaccess.EstJourFerie(date_Ouv) && !mDBaccess.EstJourWeekEnd(date_Ouv)) {
                                    count++; 
                                    date_Ouv = mDBaccess.AjouterJoursADate(date_Ouv, 1);                        
                            } else  date_Ouv = mDBaccess.JourOuvrableApres(date_Ouv);               
                        }
                return count;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void methodeAppelante() {
           new Thread(new Runnable(){
                    public void run(){
                          int count = monObjet.get_NbreJourOuvrable();
                          // ici je place du code qui exploite count
                    }
           }).start();
     
    }

  8. #8
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par visiwi Voir le message
    D'un point de vue généraliste, je te conseille d'avoir une méthode qui retourne ton count sans thread.
    Et tu utilise un thread aux différents endroits de ton prog qui appel cette méthode.
    +1

    A noter que c'est exactement l'objectif de la classe SwingWorker


    a++

    PS : Les noms de méthodes sont assez éloigné des conventions de nommages

  9. #9
    Débutant
    Inscrit en
    Avril 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 360
    Points : 132
    Points
    132
    Par défaut
    Ok, merci je vais tester tous de suite
    je vais faire des recherches sur le web.

  10. #10
    Débutant
    Inscrit en
    Avril 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 360
    Points : 132
    Points
    132
    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
    15
    16
    17
    18
    19
    20
    21
    22
        private int get_NbreJourOuvrable(){
                int count = 0;
                Date date_Ouv = (Date)Date.fromText("01/01/2002", "dd/mm/yyyy", "");
                Date date_Fin = (Date)Date.fromText("18/02/2009", "dd/mm/yyyy", "");                    
                if (date_Ouv.compareTo(date_Fin) > 0) return -1;                        
                while (date_Ouv.compareTo(date_Fin) <= 0) {
                    if (!mDBaccess.EstJourFerie(date_Ouv) && !mDBaccess.EstJourWeekEnd(date_Ouv)) {
                            count++; 
                            date_Ouv = mDBaccess.AjouterJoursADate(date_Ouv, 1);                        
                    } else  date_Ouv = mDBaccess.JourOuvrableApres(date_Ouv);               
                }
                return count;
        }
     
        private void TempsReponse(){
            new Thread(new Runnable(){
                    public void run(){
                        int countx = get_NbreJourOuvrable();
                        Histo_Prof = countx;
                    }
            }).start();
        }
    lors de l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                TempsReponse();
                System.out.print( Histo_Prof );
    on trouve 0

  11. #11
    Débutant
    Inscrit en
    Avril 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 360
    Points : 132
    Points
    132
    Par défaut
    comment, on peut résoudre le truc, j'ai testé avec SwingWorker, mais je travail avec la version 5 de java, import
    javax.swing.SwingWorker; "not found"

  12. #12
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par opensource Voir le message
    lors de l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                TempsReponse();
                System.out.print( Histo_Prof );
    on trouve 0
    On dirait que tu n'as pas bien compris le fonctionnement des threads !!!
    Le code est exécuté en tâche de fond et la valeur n'est pas encore modifié lorsque tu la lis !!!

    Citation Envoyé par opensource Voir le message
    comment, on peut résoudre le truc, j'ai testé avec SwingWorker, mais je travail avec la version 5 de java, import
    javax.swing.SwingWorker; "not found"
    https://swingworker.dev.java.net/

    Sinon la solution du thread donné par visiwi peut faire l'affaire (avec un SwingUtilities.invokeLater() pour modifier l'interface graphique).

    a++

Discussions similaires

  1. les Threads en Java
    Par siempre dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 11/10/2010, 11h01
  2. Les threads en Java / Swing et le "corpus" du programme
    Par jeanjean6 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 14/04/2010, 10h17
  3. Les Threads en java
    Par khaigo dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 27/10/2009, 14h58
  4. les threads en java
    Par karimala dans le forum Général Java
    Réponses: 2
    Dernier message: 29/12/2008, 14h45
  5. les threads en java
    Par t.n.b.g dans le forum Général Java
    Réponses: 3
    Dernier message: 31/01/2008, 17h48

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