/*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();
}
}
|