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

avec Java Discussion :

eclaircissement sur les threads


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 25
    Points : 23
    Points
    23
    Par défaut eclaircissement sur les threads
    Bonjour

    J'ai lu dans mon cours qu'il y a deux formes d'attentes pour un thread une actif et l'autre est dite passif.
    j'ai pas bien compris qu'est ce que ça veut dire!

    Merci d'avance pour vos eclaircissements.

  2. #2
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    salut,

    je pense que ton cours fait référence aux 2 fonctions
    - sleep(int n) qui "endort" le thread pendant n milli secondes
    - yield() qui "endort" le thread pour laisser les autres threads s'executer

    sleep est à mon avis une attente passive et yield active

    mavina, qui espere ne pas trop être dans la semoule ^^
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  3. #3
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Moi je dirais que c'est employé seulement quand 2 threads sont "concurrents", c'est à dire qu'ils employent la même ressource et que leur opération sur cette ressource est critique (c'est à dire ne peut être interrompue). Ainsi tu as deux méthodes de faire pour éviter que les threads ne se marchent dessus :

    1. Attente active : Il me semble que c'est quand tu boucles dans le vide en attendant sur une condition que l'autre thread renvoie, le problème c'est que ca bouffe des performances
    2. Attente passive :Ca consiste à faire dormir ton thread (sleep()) pendant un certain temps, mais le problème c'est que tu ne peut pas être sur du temps qu'il faut le laisser "dormir"
    Je suis pas sur non plus que c'est ca

  4. #4
    Membre du Club Avatar de lunart
    Homme Profil pro
    Administrateur système et réseau
    Inscrit en
    Décembre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur système et réseau

    Informations forums :
    Inscription : Décembre 2003
    Messages : 79
    Points : 63
    Points
    63
    Par défaut
    Et hop un troisième avis:
    J'ai eu un projet de simulation de robots à faire récemment.
    Les robots étant en threads.
    J'ai utilisé 2 sortes d'attentes:
    - sleep() permet d'endormir le processus un certain temps (que je qualifierais d'attente active) permet d'éviter de faire tourner le processeur dans le vide par exemple.
    - wait() interomp le processus du robot (que je qualifierais d'attente passive) il attend qu'un autre thread lui dise de redémarrer à l'aide de la fonction notify() ou notifyAll(). Dans mon cas seul le processus qui a lancé le thread à l'aide de start() pouvait execute la commande notify() ou notifyAll()

  5. #5
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Je dirai aussi qu'il s'agit de sleep et wait.

    Mais je qualifierai plutôt sleep de passif (ben oui, il ne fait rien et attend bêtement que le temps passe) et wait d'actif(s'il est notifié il se réveillera, il reste donc actif dans le sens ou il attend d'être notifié)

    mais je peux me tromper
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  6. #6
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    C'est vrai que pour un Thread, c'est assez ambigüe comme vocabulaire l'attente active et passive, et je pense que ce n'est pas très pertinent à la compréhension d'un Thread...

  7. #7
    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 lunart
    - sleep() permet d'endormir le processus un certain temps (que je qualifierais d'attente active) permet d'éviter de faire tourner le processeur dans le vide par exemple.
    Non justement : sleep() est une méthode d'attente passive... tout comme wait() ou yield() (même si ce n'est pas vraiment une "attente", yield laisse seulement la main aux autres threads)

    Plus globalement l'attente passive signifie que ton thread ne fait rien pendant son attente : le thread est endormie. Il n'utilise pas de temps processus tant qu'il est en attente...

    Par exemple si tu endors ton thread pendant 10s de la manière suivante c'est une attente passive (ton thread ne fera rien pendant 10s) :
    Au contraire on parle d'attente active lorsque le thread effecute un traitement pour savoir si il doit continuer ou pas. Ce type d'attente peut être assez lourde en temps processus, car elle effectue un grand nombre de fois le même traitement... Elle prend donc du temps processus pour "attendre"...

    Ainsi pour "endormir" ton thread pendant 10s avec une attente active cela donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    long t0 = System.currentTimeMillis();
    while ( System.currentTimeMillis()-t0 < 10000) ;
    Ce qui chez moi me donne plus de 120 millions d'itérations (et donc 120 millions d'appels à System.currentTimeMillis(), 120 millions de soustractions, et 120 millions de comparaison...)


    Globalement, les attentes actives pures sont à éviter car elles pourrisent les performances en demandant au processeur d'effectuer la même opération un grand nombre de fois...

    Si on ne peut pas faire autrement, il est préférable d'y ajouter une attente passive à l'intérieur afin de limiter le nombre d'instruction...

    Ainsi en rajoutant un yield() on descent à 8 millions d'itérations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    long t0 = System.currentTimeMillis();
    while ( System.currentTimeMillis()-t0 < 10000) {
        Thread.yield();
    }
    Et encore mieux avec un sleep de 5ms, on se retrouve avec un peu plus de 1600 itérations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    long t0 = System.currentTimeMillis();
     while ( System.currentTimeMillis()-t0 < 10000) {
        Thread.sleep(5);
    }

    Donc pour résumer :
    • Attente passive : le thread ne fait rien, et n'utilise le processeur.
    • Attente active : le thread effectue des traitements pendant toute la durée de l'attente. Il utilise donc le processeur.
    Les attentes actives doivent obligatoirement être cumulé avec une attente passive afin d'éviter de plomber les performances

    a++

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    je rejouterais que, en général, les attente active ne sont nécessaires qu'à bas niveau, dans l'os, quand il est mpossible de mettre en suspend, pour une raison ou une autre, le thread courant en attendant une condition. A au niveau, avec les système de sémaphore et de notification, les sleeps, etc, il est vraiment rare d'avoir besoin d'une attente active. Sauf bien sur si tu veux effectuer un traitement quelconque "en attendant", du style "tant que j'ai pas la main sur la ressource X, je fais du précalcul dont j'aurais besoin du résultat plus tard"

Discussions similaires

  1. Quelques questions sur les threads
    Par benj63 dans le forum C++Builder
    Réponses: 28
    Dernier message: 21/11/2005, 13h27
  2. Question sur les threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 21/10/2005, 09h08
  3. Question sur les threads
    Par nicolas66 dans le forum MFC
    Réponses: 4
    Dernier message: 03/06/2005, 20h57
  4. Aide sur les Threads
    Par themoye dans le forum MFC
    Réponses: 24
    Dernier message: 06/03/2005, 15h02
  5. Question simple sur les threads :)
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2003, 04h13

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