/* * 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) * * Quatrième Partie * ---------------- * * Nous allons compliquer le problème : maintenant, il y a un troisième * contrôleur : Boris. Boris est le supérieur hiérarchique d'Albert et * d'Ahmed et ne vérifie un sac qu'une fois qu'il a été vérifié par * Albert ou Ahmed. * */ class ControleurSac implements Runnable { /* * ajouter deux paramètres au constructeur de ControleurSac, l'un * pour indiquer son niveau, l'autre pour paramètrer la vitesse à * laquelle il peut vérifier un Sac */ private int niveau; private int borneDelai; private String nom; public ControleurSac(String inNom, int inNiveau, int inBorneDelai) { nom = inNom; niveau = inNiveau; borneDelai = inBorneDelai; } public void verifie(int i) { System.out.println(nom + " commence le sac " + i); double delai = Math.random()*borneDelai; try { Thread.sleep( (int) delai); } catch (InterruptedException e) { } System.out.println(nom + " a fini le sac " + i); } public void run() { for (int i=0 ; i<10 ; i++) { Simulation4.lesSacs[i].tuEsVerifiePar(this); } } public int getNiveau() { return niveau; } } class Sac { public Sac(int inNumero) { numero = inNumero; dejaVerifie = false; // inutile, c'est la valeur par défaut } /* * * modifier la méthode tuEsVerifiePar(ControleurSac) pour qu'elle * retourne immédiatement si le sac a déjà été vérifié par un contrôleur * de ce niveau mette en attente Boris si le Sac n'a pas encore été * vérifié par Ahmed ou Albert permette la vérification du Sac dans les * autres cas, mette à jour les variables et notifie les threads en * attente éventuelle * */ public synchronized void tuEsVerifiePar(ControleurSac inControleur) { if (inControleur.getNiveau() == 0 && dejaVerifie) return; try { /* * * On peut remarquer que l'appel de wait() est dans une boucle * while plutôt que dans une simple alternative. En effet, quand * le thread sort de la file d'attente, il ne sait pas "qui" l'a * réveillé ; il lui faut donc vérifier que les conditions qu'il * attendait sont bien réunies ; si ce n'est pas le cas, il se * remet en attente. * */ while (inControleur.getNiveau() == 1 && !dejaVerifie) { wait(); } } catch (InterruptedException e) { } dejaVerifie = true; inControleur.verifie(numero); } private int numero; private boolean dejaVerifie; } /* * modifier la fonction main pour instancier et lancer un * troisième contrôleur du nom de Boris, plus rapide que * les autres contrôleurs */ public class Simulation4 { 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", 0, 1000); t = new Thread(a); t.start(); a = new ControleurSac("Albert", 0, 1000); t = new Thread(a); t.start(); a = new ControleurSac("Boris", 1, 300); 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 Boris commence le sac 0 Boris a fini le sac 0 Ahmed a fini le sac 1 Ahmed commence le sac 2 Boris commence le sac 1 Ahmed a fini le sac 2 Ahmed commence le sac 3 Boris a fini le sac 1 Boris commence le sac 2 Boris a fini le sac 2 Ahmed a fini le sac 3 Ahmed commence le sac 4 Boris commence le sac 3 Ahmed a fini le sac 4 Ahmed commence le sac 5 Boris a fini le sac 3 Boris commence le sac 4 Boris a fini le sac 4 Ahmed a fini le sac 5 Ahmed commence le sac 6 Boris commence le sac 5 Boris a fini le sac 5 Ahmed a fini le sac 6 Ahmed commence le sac 7 Boris commence le sac 6 Boris a fini le sac 6 Ahmed a fini le sac 7 Ahmed commence le sac 8 Boris commence le sac 7 Boris a fini le sac 7 Ahmed a fini le sac 8 Ahmed commence le sac 9 Boris commence le sac 8 Boris a fini le sac 8 Ahmed a fini le sac 9 Boris commence le sac 9 Boris a fini le sac 9 */