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 -
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 ;)
ET voilà l'exécution du prgm:
Et ainsi de suite
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:
- Les Thread: problème des philosophes avec les moniteur. Problème
- Compte thread - Accueil - Réseaux sociaux
- Thread instagram c'est quoi - Accueil - Guide réseaux sociaux
- Fausse appli Threads : déjà une imitation frelatée et dangereuse ! - Accueil - Guide arnaque
- Thread instagram - Guide
- C'est quoi thread instagram - Accueil - Instagram
1 réponse
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.
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.
En fait tu n'utilises pas les mécanismes de synchronisation, puisque tu fais de l'attente active avec ta boucle 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...)