Les Thread: problème des philosophes avec les moniteur. Problème

Résolu
nali09 Messages postés 9 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
Voilà le code du fameux problème des philosophes! mon prgm s'exécute normalement mais je trouve que la solution que donne ce programme est fausse!
Merci de me donné un petit coup de main ;)


public class philomoniteur {
 private boolean fourchette[];
    
    philomoniteur() {
  fourchette =new boolean [5];
  for (int i=0; i<5; i++) {fourchette[i]=false;}  

}
    public synchronized void tentedemanger (int i){
     while(fourchette[i]){
      System.out.println(" philosophe " + i + " obtient la fourchette "+i+" et la fourchette " + (i+1)%5);
      fourchette[i]= true ;
            fourchette [(i+1)%5]=true ; 
     }
    
    }
    public synchronized void finidemanger (int i){
     fourchette [i] =false; 
        fourchette [(i+1)%5]= false;
        System.out.println("philosophe "+i+" libére la fourchette "+ i +" et la fourchette "+ (i+1)%5);
        notifyAll(); 
    }   
}
class philosophe extends Thread {
 int i; 
 philomoniteur  pm;
 philosophe (int n ,philomoniteur pm){
  i=n ; 
  this.pm=pm;}  
 public void run () {
  try{
   while (true) {
    pm  .tentedemanger (i);
     System.out.println(Thread.currentThread().getName()+" mange");
      Thread .sleep ( 6000*(int) Math.random());
      pm .finidemanger (i);
       }
  }catch (Exception e) {
   // TODO: handle exception
  }
 } 
}
class philomain {
 
 public static void main (String argv[]) {
  philomoniteur pm= new philomoniteur();
  philosophe philosophe []= new philosophe[5];
  for (int i=0;i<5;i++){
   philosophe[i]= new philosophe(i,pm); 
   philosophe[i].setName ("philosophe "+i);
   philosophe[i].start();
  }
 }
}



ET voilà l'exécution du prgm:


philosophe 0 libére la fourchette 0 et la fourchette 1
philosophe 0 mange
philosophe 0 libére la fourchette 0 et la fourchette 1
philosophe 0 mange
philosophe 1 libére la fourchette 1 et la fourchette 2
philosophe 1 mange
philosophe 2 libére la fourchette 2 et la fourchette 3
philosophe 2 mange
philosophe 2 libére la fourchette 2 et la fourchette 3
philosophe 2 mange
philosophe 1 libére la fourchette 1 et la fourchette 2
philosophe 1 mange
philosophe 0 libére la fourchette 0 et la fourchette 1
philosophe 0 mange
philosophe 3 libére la fourchette 3 et la fourchette 4
philosophe 3 mange
philosophe 4 libére la fourchette 4 et la fourchette 0
philosophe 4 mange
philosophe 3 libére la fourchette 3 et la fourchette 4
philosophe 3 mange
philosophe 0 libére la fourchette 0 et la fourchette 1
philosophe 0 mange
philosophe 0 libére la fourchette 0 et la fourchette 1
philosophe 0 mange
philosophe 1 libére la fourchette 1 et la fourchette 2
philosophe 1 mange
philosophe 2 libére la fourchette 2 et la fourchette 3
philosophe 2 mange
philosophe 2 libére la fourchette 2 et la fourchette 3
philosophe 2 mange
philosophe 2 libére la fourchette 2 et la fourchette 3
philosophe 2 mange
philosophe 2 libére la fourchette 2 et la fourchette 3
philosophe 2 mange
philosophe 1 libére la fourchette 1 et la fourchette 2
philosophe 1 mange
philosophe 0 libére la fourchette 0 et la fourchette 1
philosophe 0 mange
philosophe 3 libére la fourchette 3 et la fourchette 4
philosophe 3 mange
philosophe 4 libére la fourchette 4 et la fourchette 0
philosophe 4 mange
philosophe 3 libére la fourchette 3 et la fourchette 4
philosophe 3 mange
philosophe 0 libére la fourchette 0 et la fourchette 1
philosophe 0 mange
philosophe 0 libére la fourchette 0 et la fourchette 1
philosophe 0 mange
philosophe 0 libére la fourchette 0 et la fourchette 1
philosophe 0 mange
philosophe 1 libére la fourchette 1 et la fourchette 2
philosophe 1 mange
philosophe 2 libére la fourchette 2 et la fourchette 3
philosophe 2 mange
philosophe 2 libére la fourchette 2 et la fourchette 3
philosophe 2 mange
philosophe 2 libére la fourchette 2 et la fourchette 3
philosophe 2 mange
philosophe 2 libére la fourchette 2 et la fourchette 3
philosophe 2 mange
philosophe 1 libére la fourchette 1 et la fourchette 2
philosophe 1 mange


Et ainsi de suite
A voir également:

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Il faut éviter l'utilisation de wait/notify, c'est du vieux Java, source de nombreux problèmes. Regardes plutôt les classes du package java.util.concurrent comme les Lock ou les Atomic...

C'est plus difficile, mais dans la mesure du possible, limites l'utilisation de synchronized, pour les même raisons. Avec un Lock ça se fait bien aussi.
0
nali09 Messages postés 9 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour votre,mais malheureusement notre prof nous demande d'utiliser le wait et notify! donc je suis obligé de suivre cette vielle méthodes.
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Je viens de regarder ton code, tu fais des notifyAll, mais jamais de wait !
En fait tu n'utilises pas les mécanismes de synchronisation, puisque tu fais de l'attente active avec ta boucle
while(fourchette[i])
dans tentedemanger...

Il faudrait faire un wait quand tu rentres dans ta section critique, qui soit va passer et te permettre de faire ton opération, soit va attendre que tu le libères avec un notify (attention au notifyAll qui va libérer tout le monde...)
0