elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Implementar monitor(prod/cons)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Implementar monitor(prod/cons)  (Leído 1,181 veces)
rosalva40

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Implementar monitor(prod/cons)
« 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 Esta hecho en eclipse.
Dejo las clases por separado aca:

Main
Código:
public class Main {

public static void main(String[] args) {

Buffer buf=new Buffer(5);
Monitor mon=new Monitor(buf);

Productor []p =new Productor[2];
p[0]=new Productor(1,mon);
p[1]=new Productor(2,mon);

Consumidor []c =new Consumidor[2];
c[0]=new Consumidor(1,mon);
c[1]=new Consumidor(2,mon);

p[0].start();
p[1].start();

c[0].start();
c[1].start();

}

}

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


En línea

rosalva40

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Implementar monitor(prod/cons)
« Respuesta #1 en: 19 Mayo 2015, 23:35 pm »

Ya lo solucione !  ;-)


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
PHP implementar
PHP
Ari Slash 8 4,739 Último mensaje 11 Agosto 2009, 11:18 am
por #!drvy
enlazar trigger + jobs o prod almacenado + dts
Bases de Datos
maketoak 0 1,908 Último mensaje 1 Diciembre 2011, 12:28 pm
por maketoak
implementar do events en c++
Programación C/C++
z_ane_666 2 2,537 Último mensaje 13 Diciembre 2011, 20:53 pm
por seba123neo
Implementar un servidor NAS
Redes
ramonanador 1 3,270 Último mensaje 27 Marzo 2012, 21:30 pm
por virtualedu
Implementar Seguridad en una red lan
Seguridad
alex2510 2 3,223 Último mensaje 23 Mayo 2012, 23:48 pm
por alex2510
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines