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