Sincronización de Procesos con Semáforos en Java
Classified in Design and Engineering
Written on in
English with a size of 4.1 KB
Sincronización Concurrente con Semáforos en Java
A continuación se presenta la implementación de dos hilos concurrentes (Monstruo y Almacén) que coordinan el acceso y modificación de recursos compartidos mediante la clase Semaphore de java.util.concurrent.
Clase Monstruo (Consumidor)
La clase Monstruo actúa como consumidor dentro del esquema clásico de concurrencia:
import java.util.concurrent.Semaphore;
public class Monstruo extends Thread {
Semaphore mutex;
Semaphore entrada;
Semaphore espera;
Bean b;
int galletasComidas;
public Monstruo(Bean b, Semaphore mutex, Semaphore entrada, Semaphore espera) {
this.b = b;
this.mutex = mutex;
this.entrada = entrada;
this.espera = espera;
galletasComidas = (int) (Math.random() * 10 + 1);
}
public void run() {
while (b.numReposiciones < 10) {
try {
entrada.acquire();
if (b.numGalletas == 0) {
// Chapuza gigante, pero así parece que no hay espera activa; super tip para el examen
} else {
System.out.println("Soy " + Thread.currentThread().getId() + " entro jefe");
if (b.numGalletas >= galletasComidas) {
try {
mutex.acquire();
System.out.println("Como galletas " + galletasComidas + " soy el mostrenco " + Thread.currentThread().getId());
b.numGalletas -= galletasComidas;
System.out.println("Quedan " + b.numGalletas);
mutex.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
mutex.acquire();
b.numGalletas = 0;
System.out.println("Zampo todas " + galletasComidas + " soy el mostrenco " + Thread.currentThread().getId());
mutex.release();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Soy " + Thread.currentThread().getId() + " salgo jefe");
}
entrada.release();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}Clase Almacén (Productor)
La clase Almacen se encarga de reponer las existencias cuando se agotan:
import java.util.concurrent.Semaphore;
public class Almacen extends Thread {
Semaphore mutex;
Semaphore entrada;
Semaphore espera;
Semaphore almacenero;
Semaphore monstruo;
Bean b;
public Almacen(Bean b, Semaphore mutex, Semaphore entrada, Semaphore espera) {
this.b = b;
this.mutex = mutex;
this.entrada = entrada;
this.espera = espera;
}
public void run() {
while (b.numReposiciones < 10) {
try {
entrada.acquire();
if (b.numGalletas == 0) {
System.out.println("Soy almacenero " + Thread.currentThread().getId() + " entro jefe");
mutex.acquire();
System.out.println("Almacenero repone " + b.numReposiciones);
b.numGalletas = 10;
b.numReposiciones++;
System.out.println("Soy almacenero " + Thread.currentThread().getId() + " salgo jefe");
mutex.release();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
entrada.release();
}
}
}