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

Related entries: