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
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(); } }