En principio la implementación es libre mientras se respete el modelo y funcione como es debido, en la práctica en estos casos hemos utilizado monitores que gestionan el resto de hilos, una baliza en un parking, el típico problema del puente de Duero... Por el enunciado interpreto que cada persona es un hilo y que el circuito controla el acceso de estos, la sala de espera será una cola con capacidad máxima. Lo más parecido que he hecho creo que es esto para el ejercicio del puente de Duero (que ya me parece un pooto milagro para el nivel que tenemos):
Spoiler: Ver
Código:package ud4ejerProp3spl; import java.util.Random; /** * * @author SPL */ public class Coche extends Thread{ private final int IZQ = 0; private final int DER = 1; private int sentido; private static int n = 0; Monitor monitor; private int id; public Coche(Monitor monitor){ n++; id = n; this.monitor = monitor; } @Override public void run(){ try { sleep((long) ((new Random()).nextInt(80000))); this.sentido = (new Random()).nextInt(2); //0 o 1 if (sentido==IZQ) { puenteporlaIzq(); }else if (sentido==DER) { puenteporlaDer(); }else{ System.out.println("Error, el coche se ha generado en un sentido no válido"); } } catch (InterruptedException e) { System.out.println("Error "+e); } } private void puenteporlaIzq(){ try { monitor.llegacocheIzq(id); monitor.pasacocheIzq(id); sleep(100); monitor.salecocheIzq(id); } catch (InterruptedException e) { System.out.println("Error " + e); } } private void puenteporlaDer(){ try { monitor.llegacocheDer(id); monitor.pasacocheDer(id); sleep(100); monitor.salecocheDer(id); } catch (InterruptedException e) { System.out.println("Error " + e); } } }Código:package ud4ejerProp3spl; import javax.imageio.IIOImage; /** * * @author SPL */ public class Monitor { private final int DER=1; private final int IZQ=0; private final int NONE=-1; private final int MAXSEGUIDOS =1; private final int CAPACIDAD = 1; private int colaCochesIzq; private int colaCochesDer; private int cochesPuenteIzq; private int cochesPuenteDer; int turno; int seguidos; int ocupacion; Monitor monIzq; Monitor monDer; public Monitor(){ colaCochesDer = colaCochesIzq = 0; cochesPuenteDer = cochesPuenteIzq = 0; turno = NONE; seguidos = 0; ocupacion = 0; } //constructor parametrizado II public Monitor(Monitor izq,Monitor der){ this(); this.monDer = der; this.monIzq = izq; } public synchronized void llegacocheIzq(int id){ System.out.println("El coche "+id+" llega a la cola (izquierda)"); colaCochesIzq++; } public synchronized void llegacocheDer(int id){ System.out.println("El coche "+id+" llega a la cola (derecha)"); colaCochesDer++; } public synchronized void salecocheIzq(int id){ System.out.println("El coche "+id+" sale del puente (izquierda)"); boolean ultimo = false; cochesPuenteIzq--; ocupacion--; if (ocupacion==0) { ultimo = true; } if (cochesPuenteIzq==0) { if (cochesPuenteDer > 0) { turno = DER; }else{ turno= NONE; } if(seguidos==MAXSEGUIDOS){ seguidos=0; } } if ((turno==IZQ || turno==NONE) && seguidos<MAXSEGUIDOS && !ultimo && ocupacion < CAPACIDAD){ despertarIzq(); }else if (ultimo && turno==DER) { despertarDer(); } } public synchronized void salecocheDer(int id){ System.out.println("El coche "+id+" sale del puente (derecha)"); boolean ultimo = false; cochesPuenteDer--; ocupacion--; if (ocupacion==0) { ultimo = true; } if (cochesPuenteDer==0) { if (cochesPuenteIzq > 0) { turno = IZQ; }else{ turno= NONE; } if(seguidos==MAXSEGUIDOS){ seguidos=0; } } if ((turno==DER || turno==NONE) && seguidos<MAXSEGUIDOS && !ultimo && ocupacion < CAPACIDAD){ despertarDer(); }else if (ultimo && turno==IZQ) { despertarIzq(); } } private synchronized void despertarDer(){ try { this.monDer.notify(); } catch (Exception e) { } } private synchronized void despertarIzq(){ try { this.monIzq.notify(); } catch (Exception e) { } } public synchronized void pasacocheIzq(int id){ try { if (turno == DER || seguidos >= MAXSEGUIDOS || ocupacion >= CAPACIDAD) { monIzq.wait(); } turno = IZQ; System.out.println("El coche " +id+ " está cruzando el puente (izquierda)"); cochesPuenteIzq++; ocupacion++; System.out.println("Ocupación del puente: " + ocupacion + "/" +CAPACIDAD); colaCochesIzq--; //se quita de la cola if (colaCochesDer>0) { seguidos++; } System.out.println("Coches seguidos mientras en DERECHA esperan: " +seguidos+ "/" + MAXSEGUIDOS); } catch (InterruptedException e) { System.out.println("Error" + e); }catch (IllegalMonitorStateException e){ } } public synchronized void pasacocheDer(int id){ try { if (turno == IZQ || seguidos >= MAXSEGUIDOS || ocupacion >= CAPACIDAD) { monDer.wait(); } turno = DER; System.out.println("El coche " +id+ " está cruzando el puente (derecha)"); cochesPuenteDer++; ocupacion++; System.out.println("Ocupación del puente: " + ocupacion + "/" +CAPACIDAD); colaCochesDer--; //se quita de la cola if (colaCochesIzq>0) { seguidos++; } System.out.println("Coches seguidos mientras en IZQUIERDA esperan: " +seguidos+ "/" + MAXSEGUIDOS); } catch (InterruptedException e) { System.out.println("Error" + e); }catch (IllegalMonitorStateException e){ } } }Código:package ud4ejerProp3spl; /** * * @author SPL */ public class UD4EjerProp32SPL { static int numcoches = 10; public static void main(String[] args) { Monitor auxIzq = new Monitor(); Monitor auxDer = new Monitor(); Monitor puente = new Monitor(auxIzq,auxDer); Coche aux; for (int i = 0; i < numcoches; i++) { aux = new Coche(puente); aux.start(); } } }
A la gente con experiencia, os parece algo sencillo para un (unos) estudiante/s novatillo/s? Sed sinceros, no va a doler.
Marcadores