Programacion Concurrente
  Grapado
 

/*monitores*/

import java.io.*;

class mesa extends MyObject{
 private int tabaco,papel,cerillo,x;
 private boolean vacia;
 private ConditionVariable poner = null;
 private ConditionVariable sacar = null;
 
 public mesa(){
  tabaco=1;
     papel=2;
     cerillo=3;
     vacia=true;
     poner = new ConditionVariable();
     sacar = new ConditionVariable();
 }
         
 public synchronized void Poner(int n){
   while(!vacia) wait(poner);
   if(n==tabaco) x=papel+cerillo;
   else
     if(n==papel) x=tabaco+cerillo;
     else x=tabaco+papel;
   vacia=false;
   notify(sacar);
    }
  
    public synchronized int Sacar(){
     while(vacia) wait(sacar);
     vacia=true;
     notify(poner);
     return x;
     }
    
     public synchronized boolean vacia(){
      notify(poner);
      notify(sacar);
      return vacia;
     }
}

class fumador1 extends Thread{
 private mesa m;
 private int n;
 public fumador1(mesa x, int y){this.m=x;this.n=y;}
 public void run(){
  for(int i=0;i<n/3;i++)
  {
   if(m.Sacar()==5){
    System.out.println("1 Fumon");
    try{sleep((int)(Math.random()*3000));}
           catch(InterruptedException e){System.out.println("error"+e.toString());}
       }
       else if(i!=0) i--;
   }
 }
}

class fumador2 extends Thread{
 private mesa m;
 private int n;
 public fumador2(mesa x, int y){this.m=x;this.n=y;}
 public void run(){
  for(int i=0;i<n/3;i++){
   if(m.Sacar()==4){
    System.out.println("2 Fumon");
    try{sleep((int)(Math.random()*3000));}
           catch(InterruptedException e){System.out.println("error"+e.toString());}
       }
       else if(i!=0) i--;
   }
 }
}

class fumador3 extends Thread{
 private mesa m;
 private int n;
 public fumador3(mesa x, int y){this.m=x;this.n=y;}
 public void run(){
  for(int i=0;i<n/3;i++){
   if(m.Sacar()==3){
    System.out.println("3 Fumon");
    try{sleep((int)(Math.random()*3000));}
           catch(InterruptedException e){System.out.println("error"+e.toString());}
       }
       else if(i!=0) i--;
   }
 }
}

class agente extends Thread{
 private mesa m;
 private int n;
 public agente(mesa x, int y){this.m=x;this.n=y;}
 public void run(){
    while(n>0){
  for(int i=1;i<=3 && n>0;i++){
   if(m.vacia()){
    System.out.println("Mesa vacia");
                System.out.println("Poniendo...");
                if(i==1) System.out.println("papel+cerillo");
                else
                  if(i==2) System.out.println("tabaco+cerillo");
                  else System.out.println("tabaco+papel");
                } 
                n--;
                m.Poner(i);
                try{sleep((int)(Math.random()*3000));}
           catch(InterruptedException e){System.out.println("error"+e.toString());}
      
    }
   }
    }
}

public class Fumadores{
 public static void main(String[] args){
  mesa table=new mesa();
  int cigarros=6;
  fumador1 f1=new fumador1(table,cigarros);
  fumador2 f2=new fumador2(table,cigarros);
  fumador3 f3=new fumador3(table,cigarros);
  agente a=new agente(table,cigarros);
  a.start();
  f1.start();
  f2.start();
  f3.start();
 }
}

 
   
 
Este sitio web fue creado de forma gratuita con PaginaWebGratis.es. ¿Quieres también tu sitio web propio?
Registrarse gratis