/* * 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) * * Deuxième Partie * --------------- * * Nous allons faire en sorte que deux contrôleurs ne puissent pas * accéder simultanément à un même sac. * */ /* * Définir la classe ControleurSac qui implémente l'interface * Runnable. */ class ControleurSac implements Runnable { public ControleurSac(String inNom) { nom = inNom; } /* * modifier la méthode run() pour envoyer le message * tuEsVerifiePar(this) au sac que l'on souhaite vérifier */ public void run() { for (int i=0 ; i<10 ; i++) { Simulation2.lesSacs[i].tuEsVerifiePar(this); } } public String getNom() { return nom; } String nom; } /* * construire la classe Sac */ class Sac { private int numero; /* * doter tout Sac d'un numéro défini à la construction du sac */ public Sac(int inNumero) { numero = inNumero; } /* * définir la méthode tuEsVerifiePar(ControleurSac). Cette méthode * effectue le travail de verifieSac (affichage de message, mise en * sommeil, affichage de message). * * * Si on enlève le mot-clef synchronized, on * permet la vérification simultanée du sac par deux * vérificateurs différents */ public synchronized void tuEsVerifiePar(ControleurSac inControleur) { 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 Simulation2 { /* * dans la classe Simulation, créer la variable statique lesSacs, * tableau de 10 Sacs. */ public final static int NB_SACS = 10; /* * modifier la fonction main pour instancier le tableau les Sacs */ 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; } /* synchronisée: Ahmed commence le sac 0 Ahmed a fini le sac 0 Ahmed commence le sac 1 Albert commence le sac 0 Ahmed a fini le sac 1 Ahmed commence le sac 2 Ahmed a fini le sac 2 Ahmed commence le sac 3 Albert a fini le sac 0 Albert commence le sac 1 Albert a fini le sac 1 Albert commence le sac 2 Albert a fini le sac 2 Ahmed a fini le sac 3 Ahmed commence le sac 4 Albert commence le sac 3 Albert a fini le sac 3 Ahmed a fini le sac 4 Ahmed commence le sac 5 Albert commence le sac 4 Ahmed a fini le sac 5 Ahmed commence le sac 6 Ahmed a fini le sac 6 Ahmed commence le sac 7 Albert a fini le sac 4 Albert commence le sac 5 Ahmed a fini le sac 7 Ahmed commence le sac 8 Albert a fini le sac 5 Albert commence le sac 6 Ahmed a fini le sac 8 Ahmed commence le sac 9 Albert a fini le sac 6 Albert commence le sac 7 Ahmed a fini le sac 9 Albert a fini le sac 7 Albert commence le sac 8 Albert a fini le sac 8 Albert commence le sac 9 Albert a fini le sac 9 non synchronisée: retirer le mot synchronized de la méthode Ahmed commence le sac 0 Albert commence le sac 0 Albert a fini le sac 0 Albert commence le sac 1 Ahmed a fini le sac 0 Ahmed commence le sac 1 Ahmed a fini le sac 1 Ahmed commence le sac 2 Albert a fini le sac 1 Albert commence le sac 2 Albert a fini le sac 2 Albert commence le sac 3 Albert a fini le sac 3 Albert commence le sac 4 Albert a fini le sac 4 Albert commence le sac 5 Ahmed a fini le sac 2 Ahmed commence le sac 3 Albert a fini le sac 5 Albert commence le sac 6 Ahmed a fini le sac 3 Ahmed commence le sac 4 Albert a fini le sac 6 Albert commence le sac 7 Albert a fini le sac 7 Albert commence le sac 8 Ahmed a fini le sac 4 Ahmed commence le sac 5 Albert a fini le sac 8 Albert commence le sac 9 Ahmed a fini le sac 5 Ahmed commence le sac 6 Ahmed a fini le sac 6 Ahmed commence le sac 7 Albert a fini le sac 9 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 */