Probleme producteur consommateur en java


Probleme producteur consommateur en java

Le problème des producteurs et des consommateurs est un exemple informatique de synchronisation de ressources, qui peut s'envisager dans différents contextes de programmation concurrente, notamment en environnement multi-thread. Il s'agit de partager entre deux tâches, le producteur et le consommateur, une zone de mémoire tamponutilisée comme une file. Le producteur génère un élément de données, l'enfile sur la file et recommence ; simultanément, le consommateur retire les données de file. Source

probleme-producteur-consommateur-en-java







Nom package tp;


Class

Test.java 
package tp;

public class Test {

 public static void main(String[] args) {
  Producteur p=new Producteur();
  Producteur p2=new Producteur();
  Producteur p3=new Producteur();
  
     p.start();
     p2.start();
     p3.start();
  Consomateur c=new Consomateur();
  Consomateur c2=new Consomateur();
  Consomateur c3=new Consomateur();

    c.start();
    c2.start();
    c3.start();


 }

}

ShardMemoire.java

package tp;

import java.util.ArrayList;

public class ShardMemoire extends Thread {
 
 

    static final int size=10;
    private static ArrayList<Produit> l=new ArrayList<Produit>(size);
    protected ArrayList<Produit> getL(){return l;}
 protected boolean isEmpty(){
    return l.size()==0;}
 protected  boolean isFull(){return l.size()==size;}
    protected  void add(Produit p){l.add(p);}
 protected Produit remove(){return l.remove(l.size()-1);}



}






Produit.java



package tp;

public class Produit {
 private int i;
 Produit(int i){
  this.i=i;
 }
 public String toString()
 {
  return " "+i+" ";
 }

}


Producteur.java




package tp;

import java.util.Random;

public class Producteur extends ShardMemoire {
 
 
 public /*synchronized*/ void run(){
  while(true){
   try {
    sleep(new Random().nextInt(10000));
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   synchronized (getL()) {
   producteur();
   }
  }
  
 }
private void producteur(){

 
 if(isFull()){
  System.out.println("plein");
  try {
   getL().wait();
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }}
 else {
  Produit p=new Produit(new Random().nextInt(100));
  System.out.println("porduit "+p+" Ajout");
  add(p);
  getL().notifyAll();

 }
 
 
}

 
}

Consomateur.java

package tp;

import java.util.Random;

public class Consomateur extends ShardMemoire {
 
 
 public/* synchronized*/ void run(){
  while(true){
   try {
    sleep(new Random().nextInt(10000));
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   synchronized (getL()) {
    
   
    
   consomateur();
   }
   
  }
  
 }
private void consomateur(){


 if(isEmpty()){
  System.out.println("vide");
  try {
   getL().wait();
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }}
 else {
  System.out.println("produit "+remove()+" est supprimer");
  
 }
 getL().notifyAll();
}


}