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 :

Utilisation des events avec les threads


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 93
    Points : 37
    Points
    37
    Par défaut Utilisation des events avec les threads
    Bonjour,

    je développe un programme avec les threads, je veux utiliser les événemets pour
    synchroniser l'accès des threads aux files d'attentes.
    Est ce qu'il ya l'équivilant de setEvent et resetEvent de C++ en java?
    S'il y en a une autre façon de le faire, c'est gentil de la présenter.

    Merci.

  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 807
    Points
    48 807
    Par défaut
    Il y a d'autres façons de faire en java. Par exemple, le package java.util.concurrent contient de BlockingQueue qui peuvent servir à mettre X thread en attente d'élément dans la queue, pour que l'un d'entre eux traite cet élément, et à mettre de l'autre coté Y thread qui remplissent cette queue et qui attendent d'avoir de la place dedans. Donc typiquement le problème des producteurs / consommateurs.

    Dis nous exactement quel est le but recherché, et on te dira quelle structure java est adaptée à ça

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par m3allem001 Voir le message
    En fait j'ai travaillé avec les BlockingQueue et le programme tourne. Le problème c'est que les threads consomment énormément de CPU, ça peut aller jusqu'à 75 % même plus.
    Chaque classe thread contient la méthode run :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void run()
    {
    while (true) {	
     
        ////traitement
     
    }}
    J'ai essayé d'ajouter un wait dans chaque thread pour ne pas boucler infiniment pour rien,

    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
     
    public void run()
    {
    while (true) {	
     
       while(queue.isEmpty()){
     
    	synchronized (this) {
    		try {
    			this.wait();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
     }
     
     
      ////traitement
     
    }}
    càd tant que la file queue est vide laisser le thread en sleep.
    et je met queue.notify dans l'endroit où il y a remplissage de la file.
    Mais CPU Usage reste élevé.

  4. #4
    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 807
    Points
    48 807
    Par défaut
    Ce n'est pas du tout comme ça qu'on utilise une blockingqueue!! C'est comme ça qu'on consume, et tu n'a aucun besoin de tester si c'est vide :/


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(true){
       Element e = queue.take();
       // traiter e
    }

    Tout simplement.

    Et coté producteur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(true){
       Element e = creerElement();
       queue.put(e);
    }
    Tu n'a rien à faire (synchronized, wait notify) pour syncrhoniser tes thread, c'est la BlockingQueue qui fais tous le travail dans put et take.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    le block wait que j'ai ajouté c'est pas pour consume ou put mais pour tester si la file est vide ne pas entrer vainement dans la boucle et augmenter CPU Usage.
    Mon problème ne consiste pas en put et consume , ça marche bien , mais plutôt comment minimiser l'utilisation de CPU.
    Est ce que généralement l'utilisation des threads est gourmande en CPU ou quoi?

    NB : queue.take() n'existe plus!!

  6. #6
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par m3allem001 Voir le message
    NB : queue.take() n'existe plus!!
    où ça?
    take() existe bien!
    par ailleurs comme l'a dit Cheese tu cherches à te compliquer la vie pour rien ...

  7. #7
    Nouveau membre du Club
    Inscrit en
    Février 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    désolé queue.take() n'existe pas pour Queue non pas pour BlockingQueue

    Y a t'il un moyen pour minimiser CPU Usage, mon programme contient 5 threads qui accèdent à 5 BlockingQueue , le traitement prend bcq de temps.
    Même si je désactive 4 threads et je travaille avec un , CPU Usage reste élevé,
    je pense à cause du boucle while , car le thread reste toujours actif même si la file est vide.

  8. #8
    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 807
    Points
    48 807
    Par défaut
    Citation Envoyé par m3allem001 Voir le message
    Mon problème ne consiste pas en put et consume , ça marche bien , mais plutôt comment minimiser l'utilisation de CPU.
    Mais put et take minimisent déjà le cpu puisqu'ils se mettent déjà en pause ad vitam jusqu'à ce que respectivement il y aie de la place ou la liste soit vide.


    Si ton cpu grimpe en flèche, c'est probablement parce que tes producteurs vont vite à produire et, du coup, tes consommateur n'arrêtent pas de traiter.


    Montre nous le code que tu as créé simplement avec take et consume + le traitement et on te dira où est l'erreur. Les threads ne consomment pas en eux même du cpu, c'est TON code qui consomme du cpu. Si t'as 300 threads qui font un take sur un queue vide, t'aura 0% de cpu consommé. Si t'as 1 thread qui fait des take sur une queue toujours remplie, t'aura 100% de cpu consommé.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    Si ton cpu grimpe en flèche, c'est probablement parce que tes producteurs vont vite à produire et, du coup, tes consommateur n'arrêtent pas de traiter.
    c'est le cas, j'ai ajouté sleep pour quelques producteurs, il y a un peu de lenteur dans le traitement mais acceptable et CPU Usage aussi.

    Je suis encore entrain de tester, c'est bon pour le moment.

    Merci tous pour vos réponses.

Discussions similaires

  1. Utilisation des PGN avec les navigateurs IE & FF
    Par HWICE dans le forum Internet
    Réponses: 7
    Dernier message: 17/01/2008, 20h21
  2. Utiliser des Filler dans les structures avec ACCEPT
    Par beegees dans le forum Cobol
    Réponses: 2
    Dernier message: 13/01/2008, 19h09
  3. Des problemes avec ces threads <pthread.h>
    Par nasamad dans le forum GTK+ avec C & C++
    Réponses: 26
    Dernier message: 07/07/2006, 12h46

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