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 :

Compréhension des Threads


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut Compréhension des Threads
    Bonjour à tous,

    Je n'arrive pas à comprendre un programme qui utilise des threads : c'est deux classes, une qui met des int dans un buffer, l'autre qui les prend.

    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
    // Producteur.java
    public class Producteur extends Thread {
        private Buffer buf;
        private int identité;
        public Producteur(Buffer c, int n) {
            buf = c; this.identité = n;
        }
    public void run() {
       for (int i = 0; i < 100; i++) {
           buf.mettre(i);
           System.out.println("Producteur #" + this.identité 
                            + " met : " + i);
           try { sleep((int)(Math.random() * 100));}
           catch (InterruptedException e) { }
           }
        }
    }
    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
    public class Consommateur extends Thread {
        private Buffer buf;
        private int identité;
         public Consommateur(Buffer c, int n) {
            buf = c;
            this.identité = n;
        }
        public void run() {
            int val = 0;
            for (int i = 0; i < 10; i++) {
                val = buf.prendre();
                System.out.println("Consommateur #" + 
                      this.identité + " prend: " + val);
            }
        }
    }
    Ce que j'ai du mal à comprendre c'est le but du sleep dans la classe Producteur.
    Pouvez-vous m'éclairer ?

    Merci d'avance.

  2. #2
    Membre chevronné
    Homme Profil pro
    Java
    Inscrit en
    Mai 2011
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 170
    Par défaut
    Sans tout le code c'est dur de vraiment savoir mais je peux te dire ceci :

    Le sleep sert à attendre un temps déterminer avant de remettre un autre élément (int ici) dans le buffer.

    Par contre juste une remarque, l'implémentation du producteur-consommateur ici est CATASTROPHIQUE.

    Je peux fournir plus de détails si besoin de savoir pourquoi mais c'est beaucoup plus technique.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut
    D'accord, en gros on met un élément dans le buffer, on attend, et on en met un autre ? Mais c'est pas très utile, non ?

    Voilà la méthode main :
    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 Main {
        public static void main(String[] args) {
            Buffer c = new Buffer();
            Producteur p1 = new Producteur(c, 1);
            Producteur p2 = new Producteur(c, 2); 
            Producteur p3 = new Producteur(c, 3);
     
            Consommateur c1 = new Consommateur(c, 1);
            Consommateur c2 = new Consommateur(c, 2);
            Consommateur c3 = new Consommateur(c, 3);
            p1.start();p2.start();p3.start();
            c1.start();c2.start();c3.start();
            }
        }
    C'est juste un exemple que j'ai dans mon cours, je ne l'ai pas implémenté moi-même (ce que j'aurais fait aurait été 3 fois plus moche ).

  4. #4
    Membre chevronné
    Homme Profil pro
    Java
    Inscrit en
    Mai 2011
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 170
    Par défaut
    J'aurais aimé avoir la classe Buffer avec ses méthodes.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    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
    public class Buffer {
        private int valeur;
        private boolean available = false;
        public synchronized int prendre() {
            while (available == false) {
                try {wait();}
                catch (InterruptedException e) { }
            }
            available = false; notifyAll(); return valeur;
        }
        public synchronized void mettre(int val) {
            while (available == true) {
                try {wait();} catch (InterruptedException e) { }
            }
            valeur = val;available = true; notifyAll();
        }
    }
    Voilà pardon

  6. #6
    Membre chevronné
    Homme Profil pro
    Java
    Inscrit en
    Mai 2011
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 170
    Par défaut
    Ca va, la gestion est bonne mais maintenant je suis d'accord avec toi, le sleep ne sert pas à grand chose mis à part pour que tu puisses observer à l'oeil nu se qu'il se passe vraiment .

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

Discussions similaires

  1. Problème de compréhension des threads
    Par chimanos dans le forum Général Java
    Réponses: 12
    Dernier message: 25/10/2014, 08h59
  2. Variable globale / Propriété des threads
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 03/10/2003, 10h49
  3. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07
  4. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 28/11/2002, 09h40
  5. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53

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