Foro de elhacker.net

Programación => Java => Mensaje iniciado por: bengy en 8 Octubre 2011, 04:15 am



Título: Monitores
Publicado por: bengy en 8 Octubre 2011, 04:15 am
El barbero dormilón, Una peluquería tiene un barbero, una silla de peluquero y n sillas para que se sienten los clientes en espera, si es que los hay. Si no hay clientes presentes, el barbero se sienta en su silla de peluquero y se duerme. Cuando llega un cliente, este debe despertar al barbero dormilón. Si llegan más clientes mientras el barbero corta el cabello de un cliente, estos deben esperar sentados (si hay sillas desocupadas) o salirse de la peluquería (si todas las sillas están ocupadas). El problema consiste en programar al barbero y los clientes sin entrar en condición de competencia.

Alguna pregunta ??? podeis hacerla con toda confianza!!!

Código:
import java.lang.InterruptedException;
public class Barberia
{
    int contador;
    public Barberia(int contador){
    this.contador=contador;
    }
    
    
    public synchronized void atenderCliente(){
      
    if(contador==0){
        try{
        wait();
    }
    catch (InterruptedException e){
        e.printStackTrace();}
        contador++;
    }
    else if(contador>=1){
    notify();
    }
    }
    
    public synchronized void llegarCliente(){
       int copia =contador;
    if(contador==copia){
        try{
        wait();
    }
    catch (InterruptedException e){
        e.printStackTrace();}
        contador--;
    }
    else if(contador<copia){
    notify();
    }
    
    }
}




Código:
import java.lang.Thread;
import java.lang.InterruptedException;
public class Barbero extends Thread{
Barberia barberia;

public Barbero(Barberia barberia){
this.barberia=barberia;
}

public void run(){
while(true){
barberia.atenderCliente();
try{
sleep(5000);
}
catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("atendio a un cliente");
}


}
  
}






Código:
import java.lang.Thread;
import java.lang.InterruptedException;
public class Cliente extends Thread{

    Barberia barberia;

public Cliente(Barberia barberia){
this.barberia=barberia;
}

public void run(){
while(true){
barberia.llegarCliente();

System.out.println("llego un cliente");
}


}
}




Código:
import java.io.IOException;
public class PruebaBarberia
{
public static void main(String args[])throws IOException {
Barberia barberia;
Barbero barbero;
Cliente cliente;
barberia=new Barberia(20);
cliente=new Cliente(barberia);
cliente.start();
barbero=new Barbero(barberia);
barbero.start();
}
    
}

Alguna pregunta ??? podeis hacerla con toda confianza!!!


Título: Re: Monitores
Publicado por: bengy en 8 Octubre 2011, 04:33 am
Lectores y escritores, imaginemos una enorme base de datos, como por ejemplo un sistema de reservaciones de en una línea aérea, con muchos procesos en competencia, que intentan leer y escribir en ella. Se puede aceptar que varios procesos lean la base de datos al mismo tiempo, pero si uno de los procesos está escribiendo, (es decir modificando) la base de datos, ninguno de los demás procesos deberá tener acceso a esta, ni siquiera los lectores. El problema es como programar a los lectores y escritores.

ayuda con el algoritmo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Título: Re: Monitores
Publicado por: bengy en 8 Octubre 2011, 04:34 am
Productor/Consumidor, También conocido como bounded buffer problem o problema del buffer limitado. Dos procesos comparten un almacén (buffer) de tamaño fijo. Uno de ellos, el productor, coloca información en el almacén (buffer) mientras que el otro, el consumidor, la obtiene de él. Si el productor desea colocar un nuevo elemento, y el almacén se encuentra lleno, este deberá irse a \dormir". El consumidor despertara al productor cuando elimine un elemento del almacén. De forma análoga, si el almacén esta vacio y el consumidor desea eliminar un elemento del almacén, este debe \dormirse" hasta que el productor coloque algo en el almacén.


Título: Re: Monitores
Publicado por: bengy en 8 Octubre 2011, 04:39 am
Juego de ping pong


Código:
import java.lang.InterruptedException;
public class Arbitro
{
    int contador;
    public Arbitro(){
    contador=0;
    }
    public synchronized void  hacerPing(){
    if(contador==0){
        try{
            wait();
            contador++;
        }catch (InterruptedException e){
            e.printStackTrace();
        }
       
    }
    else if(contador==1){
    notify();
   
    }
}
    public synchronized void  hacerPong(){
    if(contador==1){
        try{
            wait();
            contador++;
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        contador--;
    }
    else if(contador==0){
    notify();
   
    }
    }
}




Código:
import java.lang.Thread;
import java.lang.InterruptedException;
public class Jugador1 extends Thread
{
   Arbitro arbitro;
   public Jugador1(Arbitro arbitro){
    this.arbitro=arbitro;
    }
    public void run(){
    while(true){
        arbitro.hacerPing();
        try{
            sleep(5000);
        }catch (InterruptedException e){
            e.printStackTrace();}
        System.out.println("respondio con un Ping 1");
    }
    }
}


Código:
import java.lang.Thread;
public class Jugador2 extends Thread
{
   Arbitro arbitro;
   public Jugador2(Arbitro arbitro){
    this.arbitro=arbitro;
 
    }
    public void run(){
    while(true){ 
       arbitro.hacerPong();
       
        System.out.println("respondio con un Pong 1");
    }
    }
}




Código:
import java.lang.Thread;
import java.lang.InterruptedException;
public class Jugador3 extends Thread
{
   Arbitro arbitro;
   public Jugador3(Arbitro arbitro){
    this.arbitro=arbitro;
    }
    public void run(){
    while(true){
        arbitro.hacerPing();
        try{
            sleep(5000);
        }catch (InterruptedException e){
            e.printStackTrace();}
        System.out.println("respondio con un Ping 2");
    }
    }
}



Código:
import java.lang.Thread;
import java.lang.InterruptedException;
public class Jugador4 extends Thread
{
   Arbitro arbitro;
   public Jugador4(Arbitro arbitro){
    this.arbitro=arbitro;
    }
    public void run(){
    while(true){
        arbitro.hacerPong();
        System.out.println("respondio con un Pong 2");
    }
    }
}



Código:
import java.io.IOException;
public class Prueba1
{
public static void main(String args[]) throws IOException {
   Arbitro arbitro;
   Jugador1 jugador1;
   Jugador2 jugador2;
   Jugador3 jugador3;
   Jugador4 jugador4;
   arbitro= new Arbitro();
   jugador1= new Jugador1(arbitro);
   jugador1.start();
   jugador2= new Jugador2(arbitro);
   jugador2.start();
   
   jugador3= new Jugador3(arbitro);
   jugador3.start();
   
   
   jugador4= new Jugador4(arbitro);
   jugador4.start();
}
}


Título: Re: Monitores
Publicado por: Damian100 en 25 Octubre 2011, 20:50 pm
HErmano  haber si me indicas como corre paso a paso en java como es que actuan el contador del barbero esta chevere el codigo lo entendi pero quiero una explicacion de ejecucion por favor ok se te agradece.


Título: Re: Monitores
Publicado por: bengy en 26 Octubre 2011, 04:24 am
HErmano  haber si me indicas como corre paso a paso en java como es que actuan el contador del barbero esta chevere el codigo lo entendi pero quiero una explicacion de ejecucion por favor ok se te agradece.

bueno 1) el metodo wait() es para bloquear al proceso
          2) el metodo notify() libera al proceso y siempre tiene que ser el ultimo en ser invocado

luego todo es simple logica del enunciado vale...
con eso creo que entenderas y tendras pequenas dudas

postea tus dudas especificas gracias bye