Probleme de lecteur/redacteur en java



                                              Probleme de lecteur/redacteur en java

Probleme de lecteur/redacteur en java


Le problème des lecteurs et des rédacteurs est un problème classique en théorie informatique, qui permet de modéliser les accès à des bases de données.
Il fut énoncé sous cette forme par Edsger Dijkstra, qui est également à l'origine du problème du dîner des philosophes (problème relatif en particulier à l'ordonnancement des processus). Source 


probleme-de-lecteur/redacteur-en-java







public class Test {

 public static void main(String[] args) {
     new Redacteur("jawad");
     new Redacteur("jawad2");
  new Lecteur("Ahmed");
  new Lecteur("Ahmed2");
  new Lecteur("Ahmed3");
  

 }

}

import java.util.ArrayList;
import java.util.Random;


public class Memoire extends Thread{
    
 
 private static ArrayList<String> memoire=new ArrayList<String>();
 private static int redacteur=0;
 protected int getReadateur(){return redacteur;}
 protected void setRedateur(int i){redacteur=i;}
 protected boolean isEmpty(){
  if(memoire.size()==0)return true;
  return false;
 }
 protected ArrayList<String> lire(){
  return memoire;
 }
 protected void ecrire(String m){
  memoire.add(m);
 }
 
 

  
 

}

public class Lecteur extends Memoire {
 
 String nom;
 public Lecteur(String nom){
  this.nom=nom;
 this.start();
 }

 @Override
 public void run() {
  
  while(true){
   System.out.println(":::::::Lecteur: ("+nom+")");
   synchronized (lire()) {
    lire_();
   }
    
    try {
     sleep(1000);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   
  }
 protected void lire_(){
  while(getReadateur()==1||isEmpty()){
   System.err.println("("+nom+")"+" :je suis bloque....");
   try {
    lire().wait();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  
   System.out.println("Lire");
   for(int i=0;i<lire().size();i++)System.out.println(lire().get(i));
   
 }
  
 

 

}






import java.util.Random;


public class Redacteur extends Memoire{

 String nom;
 
 public Redacteur(String nom){
  this.nom=nom;
  this.start();
 }
 public void run(){
  while(true){
  System.out.println("::::::: je suis redacteur :("+nom+")");
  synchronized (lire()) {
   ecrire_();
  }
   
   try {
    sleep(10000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   
  
 
  }
  
 }
 
  protected void ecrire_(){
   if(getReadateur()==1){
    System.out.println("("+nom+")"+"je suis bloque .....; ");
    try {
    lire().wait();
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   else{
    setRedateur(1);
    System.out.println("ecrire");
    ecrire(new Random().nextInt(1000)+"");
    try {
     sleep(10000);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    setRedateur(0);
    System.out.println("fin ecrire");
    lire().notifyAll();
   }
  }
   
}