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

Concurrence et multi-thread Java Discussion :

[Threads]Producteur - Consommateur - Filemessages


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut [Threads]Producteur - Consommateur - Filemessages
    salut tout le monde,

    j'ai fais un petit programme utilisant les threads. J'ai cree une classe producteur, consommateur, filemessages et main.
    j'ai un petit probleme dans l'utilisation de la classe filemessages dans les classes producteur et consommateur. En effet, je declare un vecteur statique file dans la classe filemessages et dans les classes prod et cons, je declare une variable de type filemessages. Resultat : j'ai une erreur dans les deux classes prod et cons disant que file n'est pas reconnu alors que c'est un vecteur statique...

    pourriez-vous m'aider s'il vous plait ?

    consommateur :
    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
    27
    28
    29
    30
    31
    import java.lang.Object;
    import java.lang.Thread;
    import java.util.Vector;
     
    public class consommateur implements Runnable{
    	private Thread monThread;
    	private String nom;
     
    	public void demarrer(){
    		if(monThread == null){
    			monThread = new Thread(this);
    			monThread.start();
    		}
    	}
    	public void arreter(){
    		if(monThread.isAlive()){
    			monThread.interrupt();
    			monThread=null;
    		}
    	}
    	public void run(){
    		try{int i =0;
    			while(! monThread.isInterrupted()){
    				String mess = "message n° " + i;
    				i--;
    				[b]maFile[/b].retirer(mess);//l'erreur est là... il reconnait pas maFile
    				monThread.sleep(200);
    			}
    		}catch(InterruptedException e){System.out.println("Interruption !");}
    	}
    }
    Producteur :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import java.lang.Object;
    import java.lang.Thread;
    import java.util.Vector;
     
    public class producteur implements Runnable {
    	private Thread monThread;
    //	private String nom;
    	public void demarrer(){
    		if(monThread==null){
    			monThread = new Thread(this);
    			monThread.start();
    		}
    	}
    	public void arreter(){
    		if(monThread.isAlive()){
    			monThread.interrupt();
    			monThread = null;
    		}
    	}
    	/* (non-Javadoc)
    	 * @see java.lang.Runnable#run()
    	 */
    	public void run(){
    		try {
    			int i =0;
    			while(!monThread.isInterrupted()){
    				String mess = "message n° "+i;
    				i++;
    				[b]maFile[/b].inserer(mess);
    				monThread.sleep(200);
    			}
    		}catch(InterruptedException e){
    			System.out.println("Interruption !");
    		}
    	}
    }
    filemessages :
    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
    27
    28
    29
    30
    31
    import java.lang.Object;
    import java.lang.Thread;
    import java.util.Vector;
     
    public class filemessages {
    	static final int taillemax = 30;
    	static Vector maFile;
    	public filemessages(){
    		maFile= new Vector();
    	}
    	public synchronized void inserer (String m)throws InterruptedException{
    		while(maFile.size()==taillemax){
    			System.out.println("Wait...");
    			wait();
    		}
    		maFile.addElement(m);
    		System.out.println("Signal !");
    		notify();
    	}
    	public synchronized String retirer()throws InterruptedException{
    		while(maFile.size()==0){
    			System.out.println("Wait...");
    			wait();
    		}
    		String mess = (String)maFile.firstElement();
    		maFile.removeElement(mess);
    		notify();
    		System.out.println(mess);
    		return mess;
    		}
    }
    merci beaucoup.

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    static Vector maFile;
    ->
    public static Vector maFile;

  3. #3
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    merci mais ca marche pas...

    P.S. : j'utilise Eclipse.

  4. #4
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    maFile doit être publique (c'est fait) mais pour reconnaître cette variable statique, tu dois indiquer aussi le nom de la classe.

    Encore une remarque si tu permets. Par convention (aucune obligation), les noms des classes commencent par une majuscule.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FileMessages
    Producteur
    Consommateur

  5. #5
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    merci beaucoup.

    du coup, avec public static void et FileMessages.maFile etc. ca ne me met plus d'erreur mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileMessages.maFile.retirer(mess)
    me provoque une erreur parce que retirer n'est pas une methode du vecteur.

    J'ai donc cree une instance publique et statique de FileMessages dans Main pour pouvoir l'utiliser à la place de maFile (le vecteur) dans le prod et le conso mais ca marche pas non plus

    Main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Main {
    	public static filemessages File = new filemessages();
    	public static void main(String[]args){
    		producteur p1=new producteur();
    		producteur p2 = new producteur();
    		consommateur c1=new consommateur();
    		consommateur c2 = new consommateur();
    		filemessages file = new filemessages ();
    		long debut = System.currentTimeMillis();
    		p1.demarrer();
    		c1.demarrer();
    	}
    }
    merci

  6. #6
    Membre averti Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Points : 437
    Points
    437
    Par défaut
    public synchronized String retirer()throws InterruptedException{
    while(maFile.size()==0){
    System.out.println("Wait...");
    wait();
    }
    String mess = (String)maFile.firstElement();
    maFile.removeElement(mess);
    notify();
    System.out.println(mess);
    return mess;
    }
    je ne sais pas si je dis du n'importe quoi, mais un wait() dans une methode synchronized : : :

  7. #7
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    ;-) let_me_in tu dis vraiment n'importe quoi.

    Ne le prend pas mal, je ne fais que te répondre.

    Plus sérieusement, la méthode wait ne peut être appelée que dans un bloque synchronisé... ;-)

  8. #8
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    et sinon mon erreur ?

    merci

  9. #9
    Membre averti Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Points : 437
    Points
    437
    Par défaut
    Ne le prend pas mal, je ne fais que te répondre.
    non, non c'etait vraiment con de ma part; j'avais meme utilise ca plusieurs fois en implementant la classe Semaphore !!!!!

    et sinon mon erreur ? Embarassed Smile

    merci
    j'ai fais qq modifications et ca marche, mais la condition de l'interblocage n'est pas verifiee.
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    import java.lang.Object;
    import java.lang.Thread;
    import java.util.Vector;
     
    class consommateur implements Runnable{
       private Thread monThread;
       private String nom;
       filemessages fm=new filemessages();
     
       public void demarrer(){
          if(monThread == null){
             monThread = new Thread(this);
             monThread.start();
          }
       }
       public void arreter(){
          if(monThread.isAlive()){
             monThread.interrupt();
             monThread=null;
          }
       }
       public void run(){
          try{int i =0;
             while(! monThread.isInterrupted()){
                String mess = "message n° " + i;
                i--;
                fm.retirer();
                monThread.sleep(200);
             }
          }catch(InterruptedException e){System.out.println("Interruption !");}
       }
    }
     
    class producteur implements Runnable {
       private Thread monThread;
    //   private String nom;
       filemessages fm=new filemessages();
     
       public void demarrer(){
          if(monThread==null){
             monThread = new Thread(this);
             monThread.start();
          }
       }
       public void arreter(){
          if(monThread.isAlive()){
             monThread.interrupt();
             monThread = null;
          }
       }
       /* (non-Javadoc)
        * @see java.lang.Runnable#run()
        */
       public void run(){
          try {
             int i =0;
             while(!monThread.isInterrupted()){
                String mess = "message n° "+i;
                i++;
                fm.inserer(mess);
                monThread.sleep(200);
             }
          }catch(InterruptedException e){
             System.out.println("Interruption !");
          }
       }
    }
     
     
    class filemessages {
       static final int taillemax = 30;
       static Vector maFile;
       public filemessages(){
          maFile= new Vector();
       }
       public synchronized void inserer (String m)throws InterruptedException{
          while(maFile.size()==taillemax){
             System.out.println("Wait...");
             wait();
          }
          maFile.addElement(m);
          System.out.println("Signal !");
          notify();
       }
       public synchronized String retirer()throws InterruptedException{
          while(maFile.size()==0){
             System.out.println("Wait...");
             wait();
          }
          String mess = (String)maFile.firstElement();
          maFile.removeElement(mess);
          notify();
          System.out.println(mess);
          return mess;
          }
    }
     
    public class Tp1{
    	public static void main(String[] arg){
    		new producteur().demarrer();
    		new consommateur().demarrer();
     
    	}
     
    }

  10. #10
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    merci

    mais si tu declare dans le prod et le cons une variable de type Filemessages, ca va pas etre là meme... ? c'est pour ca que je voulais utiliser un vecteur statique dans la classe filemessages.

  11. #11
    Membre averti Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Points : 437
    Points
    437
    Par défaut
    Citation Envoyé par slim
    merci

    mais si tu declare dans le prod et le cons une variable de type Filemessages, ca va pas etre là meme... ? c'est pour ca que je voulais utiliser un vecteur statique dans la classe filemessages.
    t'as raison oui, voici le nouveau:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    import java.lang.Object;
    import java.lang.Thread;
    import java.util.Vector;
     
    class consommateur implements Runnable{
       private Thread monThread;
       private String nom;
       filemessages fm;
     
       public consommateur(filemessages fm){
       	this.fm=fm;
       }
     
       public void demarrer(){
          if(monThread == null){
             monThread = new Thread(this);
             monThread.start();
          }
       }
       public void arreter(){
          if(monThread.isAlive()){
             monThread.interrupt();
             monThread=null;
          }
       }
       public void run(){
          try{int i =0;
             while(! monThread.isInterrupted()){
                String mess = "message n° " + i;
                i--;
                fm.retirer();
                monThread.sleep(200);
             }
          }catch(InterruptedException e){System.out.println("Interruption !");}
       }
    }
     
    class producteur implements Runnable {
       private Thread monThread;
    //   private String nom;
       filemessages fm;
     
       public producteur(filemessages fm){
       	this.fm=fm;
       }      
     
       public void demarrer(){
          if(monThread==null){
             monThread = new Thread(this);
             monThread.start();
          }
       }
       public void arreter(){
          if(monThread.isAlive()){
             monThread.interrupt();
             monThread = null;
          }
       }
       /* (non-Javadoc)
        * @see java.lang.Runnable#run()
        */
       public void run(){
          try {
             int i =0;
             while(!monThread.isInterrupted()){
                String mess = "message n° "+i;
                i++;
                fm.inserer(mess);
                monThread.sleep(200);
             }
          }catch(InterruptedException e){
             System.out.println("Interruption !");
          }
       }
    }
     
     
    class filemessages {
       static final int taillemax = 30;
       static Vector maFile;
       public filemessages(){
          maFile= new Vector();
       }
       public synchronized void inserer (String m)throws InterruptedException{
          while(maFile.size()==taillemax){
             System.out.println("Wait...");
             wait();
          }
          maFile.addElement(m);
          System.out.println("Signal !");
          notify();
       }
       public synchronized String retirer()throws InterruptedException{
          while(maFile.size()==0){
             System.out.println("Wait...");
             wait();
          }
          String mess = (String)maFile.firstElement();
          maFile.removeElement(mess);
          notify();
          System.out.println(mess);
          return mess;
          }
    }
     
     
    public class Tp1{
    	public static void main(String[] arg){
    		filemessages fm=new filemessages();
    		new producteur(fm).demarrer();
    		new consommateur(fm).demarrer();
     
    	}
     
    }

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

Discussions similaires

  1. Producteur consommateur thread semaphore
    Par KptN22 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 24/02/2011, 11h30
  2. Sémaphores Producteur consommateur Windows
    Par Artusamak dans le forum Windows
    Réponses: 4
    Dernier message: 06/04/2007, 10h40
  3. Interface producteur/consommateur utilisant SWING
    Par El pistol dans le forum AWT/Swing
    Réponses: 17
    Dernier message: 03/04/2006, 16h06
  4. Réponses: 8
    Dernier message: 09/02/2006, 19h51

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