prend la fourchette à gauche
prend la fourchette à droite
mange pendant un certain temps
met les deux fourchettes à la table
pense pendant un certain temps
class Philosopher extends Thread{ class Fork{ class Dinner{ |
P1 take fork 0 P1 look for the second fork P2 take fork 1 P2 look for the second fork P3 take fork 2 P3 look for the second fork P4 take fork 3 P4 look for the second fork P5 take fork 4 P5 look for the second fork |
L'approche le plus souvent utilisée pour éviter attente circulaire est d'imposer un ordre total de tous les types de ressources. Chaque thread demande des ressources dans un ordre croissant d'énumération. Ainsi, s'il existe unе liste ordonnée de n ressources {r1,r2,..rn} et un thread nécessite les ressources ri et ri+j pour accomplir une tâche, il doit d'abord demander ri puis ri+j.
La deuxième approche modifie le comportement des threads pour éviter préemption. Un thread doit s'assurer qu'il libère automatiquement toutes les ressources actuellement détenues si la ressource nouvellement demandée n'est pas disponible. Quand le philosophe constate que la fourchette n'est pas libre (une exception est générée) il se retire en laissant les fourchettes pour un certain temps avant de réessayer de les prendre.
public class TakenExc extends Exception{ private static final long serialVersionUID = 1L; } |
class Philosopher extends Thread{ class Fork{ class Dinner{ |