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

Résolu/Fermé
nali09 Messages postés 9 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 17 octobre 2015 - Modifié par nali09 le 2/01/2015 à 13:12
KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 - 3 janv. 2015 à 15:01
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

1 réponse

KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 3 005
2 janv. 2015 à 17:23
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 jeudi 27 mars 2014 Statut Membre Dernière intervention 17 octobre 2015
2 janv. 2015 à 21:20
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 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 3 005
3 janv. 2015 à 15:01
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