Programación Concurrente
Programación Concurrente
Class Semaphore:
Tiene un contador interno que gestiona cuántos permisos hay disponibles.
Semaphore sem1 = new Semaphore(contador);
Aquire decrementa el contador (si contador != 0), mientras que release lo incrementa.
Nota: semaphore gestiona la concurrencia para sus métodos, por lo que no se debe
combinar con cosas como synchronized o mutex.
Método Qué hace
Mutex:
Es como Semaphore, pero con un solo permiso (dos estados, bloqueado o libre).
Productor-consumidor:
Una clase produce datos, otra los procesa. Debe haber una instancia intermedia
Compartida que les permita comunicarse y que almacene el recurso compartido. Se
ejecuta siguiendo los pasos listados:
1.La clase común tiene una lista donde acumula procesos que esperan. Tiene
semáforos que controlan los permisos de acceso a la lista.
2. Todos los accesos a la lista son por medio de la clase común. Entonces:
I. El productor quiere producir, pero debe asegurarse de que la lista
compartida no esté llena.
a) Si no está llena: se agrega el proceso productor a la cola de espera.
b) Si está llena: el proceso se aborta.
II. El consumidor quiere consumir, pero debe asegurarse de que la lista no
esté vacía.
public void atender(){ //libera un permiso para que el proceso pueda ser
atendido. LO MANEJA LA CLASE COMUN.
this.atendido.release();
}
}
//constructor
public void run(){
while(true){ //Simula la espera. El consumidor está siempre disponible
para atender a un productor, pero duerme mientras espera a que un
productro entre en la cola.
Procutors siguiente = this.comp.extraerCola(); //saca el primero
de la cola de espera (FIFO) para poder ser procesado.
if(siguiente != null){
siguiente.atender(); //si la cola de espera no está vacía,
se atiende al siguiente productor.
}
else{
try{
Thread.sleep(100); //si la cola está vacía, el
consumidor duerme un tiempo antes de volver a
intentar atender un consumidor
} catch (interruptedException e){
e.printStackTrace();
}
}
}
}
return true;
}
return sig;
}