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