/* * simuler un contrôle dans une chaîne de production * * @author: harold trannois @ u-picardie * @author: M.Lokbani (adaptation ift1176 et validation jdk 1.3) * * Troisième Partie * ---------------- * * Maintenant, nous allons faire en sorte que chaque sac soit vérifié par * un et un seul vérificateur. * * Pour cela, chaque vérificateur teste le Sac. * * Celui-ci mémorise son état de vérification par une variable booléenne. * * Ainsi, chaque vérificateur teste la variable du Sac. * * Si celle-ci a la valeur fausse, il contrôle le Sac, sinon, il passe au * suivant. * * Cette solution est... fausse telle qu'exprimée. * * En effet, on a encore une fois un problème potentiel d'entrelacement : * * ahmed teste le sac 0, il constate qu'il doit le vérifier * albert teste le sac 0, il constate qu'il doit le vérifier * ahmed commence la vérification * albert commence la vérification * * Comme d'habitude, on va confier la responsabilité du contrôle à un objet. * * Cette fois-ci, nous avons un objet tout trouver pour assumer cette * charge : le Sac lui-même. * */ /* * Définir la classe ControleurSac qui implémente l'interface * Runnable. */ class ControleurSac implements Runnable { public ControleurSac(String inNom) { nom = inNom; } public void run() { for (int i=0 ; i<10 ; i++) { Simulation3.lesSacs[i].tuEsVerifiePar(this); } } public String getNom() { return nom; } String nom; } class Sac { /* * ajouter une variable booléenne dejaVerifie dans la classe Sac. */ private int numero; private boolean dejaVerifie; public Sac(int inNumero) { numero = inNumero; dejaVerifie = false; // inutile, c'est la valeur par défaut } /* * dans la méthode tuEsVerifiePar(ControleurSac), ajouter le test * de la variable et faire sortir immédiatement de la méthode si * cette variable est vraie */ public synchronized void tuEsVerifiePar(ControleurSac inControleur) { if (dejaVerifie) return; dejaVerifie = true; System.out.println(inControleur.getNom() + " commence le sac " + numero); try { double delai = Math.random()*1000; Thread.sleep( (int) delai); } catch(InterruptedException e) { } System.out.println(inControleur.getNom() + " a fini le sac " + numero); } } public class Simulation3 { public final static int NB_SACS = 10; public static void main(String[ ] args) { lesSacs = new Sac[NB_SACS]; for (int i=0 ; i < NB_SACS ; i++) { lesSacs[i] = new Sac(i); } ControleurSac a; Thread t; a = new ControleurSac("Ahmed"); t = new Thread(a); t.start(); a = new ControleurSac("Albert"); t = new Thread(a); t.start(); } public static Sac[ ] lesSacs; } /* Ahmed commence le sac 0 Ahmed a fini le sac 0 Ahmed commence le sac 1 Ahmed a fini le sac 1 Ahmed commence le sac 2 Ahmed a fini le sac 2 Ahmed commence le sac 3 Ahmed a fini le sac 3 Ahmed commence le sac 4 Ahmed a fini le sac 4 Ahmed commence le sac 5 Ahmed a fini le sac 5 Ahmed commence le sac 6 Ahmed a fini le sac 6 Ahmed commence le sac 7 Ahmed a fini le sac 7 Ahmed commence le sac 8 Ahmed a fini le sac 8 Ahmed commence le sac 9 Ahmed a fini le sac 9 */