Título: Implementar monitor(prod/cons) Publicado por: rosalva40 en 19 Mayo 2015, 22:11 pm Hola, estoy intentando resolver el problema de consumidor/productor mediante el uso de monitores, implementado semaforos binarios. En teoria creo haberlo hecho bien, pero ejecuto el programa no hace nada. se queda la consola en blanco, y cuando hago la depuracion , llega a la parte que crea los 4 hilos y no hace mas nada, y sale el cartel "Source not found". Esperaba que me pudieran ayudar.
El codigo en cuestion es este: https://drive.google.com/file/d/0B4cvhyMafb4yYTlhZ1dBYWdJQmM/view?usp=sharing (https://drive.google.com/file/d/0B4cvhyMafb4yYTlhZ1dBYWdJQmM/view?usp=sharing) Esta hecho en eclipse. Dejo las clases por separado aca: Main Código: public class Main { Clase buffer Citar public class Buffer { private int cap; private int elementos; public Buffer(int capacidad){ cap=capacidad; elementos=0; } public int get_capacidad(){ return cap; } public int get_elementos(){ return elementos; } public void insertar(){ elementos++; } public void sacar(){ elementos--; } } Clase Monitor Citar public class Monitor { private Buffer buf; private Semaforo s_cons; private Semaforo s_prod; private Semaforo s_cortesia; private Semaforo s_mutex; private int cola_cons; private int cola_prod; private int cola_cortesia; public Monitor(Buffer buffer){ buf=buffer; s_cons=new Semaforo(0,true,"s_cons"); s_prod=new Semaforo(0,true,"s_prod"); s_cortesia=new Semaforo(0,true,"s_cortesia"); s_mutex=new Semaforo(1,true,"s_mutex"); cola_cons=0; cola_prod=0; cola_cortesia=0; } // ----------------------------------------- public void producir() throws InterruptedException { s_mutex.WAIT(); // DELAY if(buf.get_elementos()==buf.get_capacidad()) { System.out.print("Se duerme productor\n"); cola_prod++; if(cola_cortesia>=1) s_cortesia.SIGNAL(); else s_mutex.SIGNAL(); s_prod.WAIT(); cola_prod--; } // FIN DELAY // RESUME else while(cola_prod>=0) { cola_cortesia++; s_prod.SIGNAL(); s_cortesia.WAIT(); cola_cortesia--; } // FIN RESUME buf.insertar(); if (cola_cortesia>0) s_cortesia.SIGNAL(); else s_mutex.SIGNAL(); } // ----------------------------------------- public void consumir() throws InterruptedException { s_mutex.WAIT(); // DELAY if(buf.get_elementos()<=0) { cola_cons++; if(cola_cortesia>=1) s_cortesia.SIGNAL(); else s_mutex.SIGNAL(); s_cons.WAIT(); cola_cons-- ; } // FIN DELAY // RESUME else while(cola_cons>=0) { cola_cortesia++; s_cons.SIGNAL(); s_cortesia.WAIT(); cola_cortesia--; } // FIN RESUME buf.sacar(); if (cola_cortesia>0) s_cortesia.SIGNAL(); else s_mutex.SIGNAL(); } } Clase Semaforo Citar public class Semaforo { private int contador = 0; private boolean binario=false; private String name; public String getName() { return name; } public Semaforo (int contador,boolean binario, String name) { this.contador = contador; this.binario=binario; this.name =name; } synchronized public void WAIT () { while (this.contador == 0) { try { this.wait(); } catch (Exception e) {} } this.contador--; } synchronized public void SIGNAL() { if(binario) this.contador=1; else { this.contador++; } notify(); } } Clase Consumidor Citar public class Consumidor extends Thread { private int id; private Monitor monitor; public Consumidor(int id, Monitor monitor2){ this.id=id; this.monitor=monitor2; } public void run(){ while(true){ try{ monitor.consumir(); System.out.println("Consumidor[" + id + "]"); sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } Clase Productor Citar public class Productor extends Thread { private int id; private Monitor monitor; public Productor(int id, Monitor monitor2){ this.id=id; this.monitor=monitor2; } public void run(){ while(true){ try{ monitor.producir(); System.out.println("Productor[" + id + "]"); sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } saludos Título: Re: Implementar monitor(prod/cons) Publicado por: rosalva40 en 19 Mayo 2015, 23:35 pm Ya lo solucione ! ;-)
|