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

Langage Java Discussion :

Méthode qui bloque l'application


Sujet :

Langage Java

  1. #1
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 232
    Points : 1 897
    Points
    1 897
    Par défaut Méthode qui bloque l'application
    Bonjour,

    Dans un programme une méthode prend beaucoup de temps à s'exécuter et je désire que l'appel de cette méthode ne bloque pas le reste de l'application.

    Alors j'ai essayé la solution suivant mais elle ne fonctionne pas.

    Voici le thread suivant qui contient la méthode bloquante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Traitement extends Thread
        {
            /**
             * Méthode pour charger en mémoire les différents clients disponibles dans la base de données
             */
            public void loadClientsRecolte() {
                ...
            }
    
        }
    Voici le lancement du thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Traitement traitement = new Traitement();
     
    // lancement du thread
    new Thread(traitement).start();
    Et voici l'appel de la méthode qui reste bloquante malgré cette implémentation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ... // code de l'appli
    
    traitement.loadClientsRecolte(); // appel de la méthode
    
    ... // code de l'appli bloqué à cause de l'appel précédent
    Comment faire cela ?
    Existe-t-il une autre solution ?

    Merci d'avance.
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Il faut redéfinisse la méthode run() héritée de 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
     
    public class Traitement extends Thread {
            /**
             * Méthode pour charger en mémoire les différents clients disponibles dans la base de données
             */
            public void loadClientsRecolte() {
                ...
            }
     
            @Override
            public void run() {
                    loadClientsRecolte();
            }
    }

  3. #3
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 232
    Points : 1 897
    Points
    1 897
    Par défaut
    Citation Envoyé par verbose Voir le message
    Il faut redéfinisse la méthode run() héritée de 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
     
    public class Traitement extends Thread {
            /**
             * Méthode pour charger en mémoire les différents clients disponibles dans la base de données
             */
            public void loadClientsRecolte() {
                ...
            }
     
            @Override
            public void run() {
                    loadClientsRecolte();
            }
    }

    Oui, mais en faisant cela il faudra que je définisse un thread pour chaque méthode différentes (car il y en a plusieurs).
    J'aimerai définir une seule classe qui contient toutes les méthodes dont j'ai besoin et qui doivent s'exécuter en parallèle à l'application.

    A+
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

  4. #4
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Tu peux aussi faire :
    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
    public class Traitement {
        public void loadClientsRecolte() {
            ...
        }
        public void loadToto() {
            ...
        }
    }
     
    //pour l'appeler :
    new Thread(new Runnable() {
        public void run() {
            new Traitement().loadClientsRecolte();
        }
    }).start();

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut
    salut,

    2 solutions. la deuxième est mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void loadClientsRecolte(){
    new Thread(new Runnable()
    {public void run()
    {//ton code
    }}).start();
    }
    soit tu fais l'incursion à chaque fois que tu appelle la fonction tu la met dans un thread anonyme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    new Thread(new Runnable()
    {public void run()
    {loadClientsRecolte();
    }}).start();
    Fais attention au multiThread pour tes accès aux ressources. (synchronized)

    A voir : http://gfx.developpez.com/tutoriel/j...ing-threading/

  6. #6
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 232
    Points : 1 897
    Points
    1 897
    Par défaut
    Citation Envoyé par philippe13 Voir le message
    salut,

    2 solutions. la deuxième est mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void loadClientsRecolte(){
    new Thread(new Runnable()
    {public void run()
    {//ton code
    }}).start();
    }
    soit tu fais l'incursion à chaque fois que tu appelle la fonction tu la met dans un thread anonyme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    new Thread(new Runnable()
    {public void run()
    {loadClientsRecolte();
    }}).start();
    Fais attention au multiThread pour tes accès aux ressources. (synchronized)

    A voir : http://gfx.developpez.com/tutoriel/j...ing-threading/
    Merci beaucoup, c'est exactement ce qui me fallait.

    J'avais trouvé une autre solution mais elle n'était pas aussi simple, quoi qu'elle aurait pu aller aussi.

    Merci encore.
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

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

Discussions similaires

  1. Application.OnTime qui bloque avec du code validé sur d'autres topic
    Par tmlpqsdpmdlc dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/04/2015, 14h11
  2. Méthode qui bloque le lancement de l'activité
    Par guigui14077 dans le forum Android
    Réponses: 4
    Dernier message: 02/05/2013, 22h19
  3. Problème de readLine() qui bloque mon application
    Par critok dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 15/08/2012, 21h20
  4. [WD11] Timer qui bloque application
    Par ivichou dans le forum WinDev
    Réponses: 11
    Dernier message: 29/04/2010, 08h14
  5. une méthode qui écrit dans la sortie html ?
    Par iubito dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 03/12/2003, 15h34

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