Ejercicio: Implementación de un Sistema Productor-Consumidor Multihilo

Enunciado del Ejercicio

Imagina que estás desarrollando un sistema de gestión para una fábrica en la que varios productores generan piezas y las colocan en un almacén compartido. Estas piezas luego son consumidas por trabajadores que las retiran para ensamblarlas. El almacén tiene una capacidad limitada, por lo que los productores deben esperar si está lleno, y los consumidores deben esperar si está vacío.

Objetivo

Diseña un programa en Java que simule este sistema utilizando hilos. Asegúrate de que el acceso al almacén esté sincronizado y de que no se produzcan condiciones de carrera.


Requisitos Técnicos

  1. Clases necesarias:
    • Una clase Almacen que represente el almacén compartido.
    • Dos tipos de hilos:
      • Productores: Agregan piezas al almacén.
      • Consumidores: Retiran piezas del almacén.
  2. Comportamiento del almacén:
    • Utiliza una estructura como ArrayList o LinkedList para representar el almacén.
    • Implementa un mecanismo de sincronización para gestionar la capacidad máxima del almacén.
  3. Sincronización:
    • Los productores deben esperar si el almacén está lleno.
    • Los consumidores deben esperar si el almacén está vacío.
  4. Ejemplo de ejecución:
    • Simula un sistema con 3 productores y 2 consumidores.
    • Los productores generan piezas identificadas con números consecutivos (por ejemplo, «Pieza 1», «Pieza 2»).
    • Cada consumidor procesa una pieza y muestra un mensaje con el identificador de la pieza consumida.

Estructura Base del Código

import java.util.LinkedList;

class Almacen {
    private final int capacidad;
    private final LinkedList<String> piezas = new LinkedList<>();

    public Almacen(int capacidad) {
        this.capacidad = capacidad;
    }

    public synchronized void producir(String pieza) throws InterruptedException {
        while (piezas.size() == capacidad) {
            wait(); // Esperar si el almacén está lleno
        }
        piezas.add(pieza);
        System.out.println("Producido: " + pieza);
        notifyAll(); // Notificar a los consumidores
    }

    public synchronized String consumir() throws InterruptedException {
        while (piezas.isEmpty()) {
            wait(); // Esperar si el almacén está vacío
        }
        String pieza = piezas.removeFirst();
        System.out.println("Consumido: " + pieza);
        notifyAll(); // Notificar a los productores
        return pieza;
    }
}

public class SistemaProductorConsumidor {
    public static void main(String[] args) {
        Almacen almacen = new Almacen(5); // Capacidad máxima del almacén

        // Crear productores
        Runnable productor = () -> {
            int contador = 1;
            try {
                while (true) {
                    String pieza = "Pieza " + contador++;
                    almacen.producir(pieza);
                    Thread.sleep(500); // Simular tiempo de producción
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        };

        // Crear consumidores
        Runnable consumidor = () -> {
            try {
                while (true) {
                    almacen.consumir();
                    Thread.sleep(1000); // Simular tiempo de consumo
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        };

        // Lanzar hilos de productores
        for (int i = 0; i < 3; i++) {
            new Thread(productor, "Productor-" + (i + 1)).start();
        }

        // Lanzar hilos de consumidores
        for (int i = 0; i < 2; i++) {
            new Thread(consumidor, "Consumidor-" + (i + 1)).start();
        }
    }
}

Requisitos de Salida

El programa debe mostrar mensajes que representen la interacción entre productores y consumidores, por ejemplo:

Producido: Pieza 1
Producido: Pieza 2
Consumido: Pieza 1
Producido: Pieza 3
Consumido: Pieza 2
Producido: Pieza 4
Producido: Pieza 5
Producido: Pieza 6
Consumido: Pieza 3

Puntos de Evaluación

  1. Uso correcto de sincronización con wait() y notifyAll().
  2. Gestión eficiente de la capacidad del almacén.
  3. Correcta simulación de producción y consumo con tiempos aleatorios o constantes.
  4. Creación de múltiples hilos para representar productores y consumidores.

Este ejercicio te permitirá consolidar tus conocimientos sobre la gestión de hilos y sincronización en Java, una habilidad clave en el desarrollo de sistemas concurrentes.

person holding a pink pen
Photo by cottonbro studio on Pexels.com

Deja un comentario

Información básica sobre protección de datos Ver más

  • Responsable: Tomas Gonzalez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

error: Content is protected !!

Descubre más desde Tomás González: Formador y Desarrollador Web

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo

Este sitio web utiliza cookies, si necesitas más información puedes visitar nuestra política de privacidad    Ver
Privacidad